Evidence · Current state

코드 근거 인벤토리

각 흐름을 어떤 화면·미들웨어·API·DB 스키마를 근거로 판단했는지 정리한 상세 자료입니다.

사실 경계

표시 의미
코드 확인 현재 브랜치의 화면, 미들웨어, DTO, 서비스, DB 스키마에서 확인한 사실
브라우저 확인 생성된 보고서가 브라우저에서 열리고 링크·레이아웃이 동작하는지 확인한 사실
미확인 운영 설정·운영 DB 보유율·외부 공급자 동의 범위처럼 코드만으로 확정할 수 없는 사항
v3 후보 현행 분석에서 나온 개선 아이디어. 현행 동작이나 확정 정책이 아님

M00 · 실제 메뉴와 진입점

헤더 메뉴 코드 apps/web/src/components/header/Header.tsx웹 미들웨어 apps/web/src/middleware.ts를 대조했다.

영역 화면 표시 경로/이동 현행 동작
M01 홈·검색 /, /search?keyword=… 홈에서 추천 채용·스펙업·커뮤니티·공지/뉴스를 노출한다. 검색은 채용·스펙업·커뮤니티를 통합 조회한다. 홈 검색은 로그인 쿠키가 없으면 로그인으로 보낸다.
M02 채용정보 /jobdescription/lawyer 공개 목록 → 상세 → 내부지원·이메일지원·외부링크지원. 내부지원 완료 뒤 /mypage/applications로 이어진다.
M03 스펙업 /specup 공개 목록 → 상세 → 외부링크 또는 이메일 이동·복사, 스크랩. 상세의 비로그인 접근은 soft gate 적용 대상이다.
M04 커뮤니티 /community/home 홈·자유·정보·인기·직역 게시판, 글/댓글/좋아요/신고, 내 글. 비로그인 목록은 community-gate로 rewrite된다.
M05 도구 /pdf, /web-card web 라우터가 아니라 별도 PDF 앱으로 hard navigation한다. /web-card는 계절성 별도 진입점이다.
M06 내 커리어 /resume, /mypage/* 이력서 편집·미리보기·PDF/ZIP, 지원현황, 채용/스펙업 스크랩, 계정관리, 설정, 로그아웃.
A01 가입·인증 /signin, /signup, /pass/callback, /auth/* 이메일 또는 카카오 로그인/가입 후 기본 USER; 법조 자격 인증이 승인되면 직역 기능을 사용한다. 로그인 방식과 전문자격 인증은 별개다.
D01 데이터 인벤토리 보고서 전용 이메일·카카오·PASS·자격인증에서 받거나 파생·일시 처리·저장하는 필드를 구분한다.

A01 · 사용자 상태별 화면 접근

아래 표는 미들웨어 86~312행 apps/web/src/middleware.ts의 화면 경로 판정이다. 서버 API의 @Roles와 리소스 소유권 검사는 별도 축이며, 화면 통과만으로 API 권한이 생기는 것은 아니다.

상태 채용 목록/상세 스펙업 목록/상세 커뮤니티 이력서·지원현황 로그인·가입
비로그인 허용 목록 허용, 외부 직접 상세 1개를 30분 허용; 내부 이동/두 번째 새 상세는 로그인 목록 허용, 상세는 같은 soft gate 상세는 soft gate, 그 외는 community-gate 로그인으로 이동하며 returnTo 보존 허용
USER(미인증) 허용 홈으로 차단 목록만 허용, 상세는 목록으로 community-gate 계정·설정·인증 화면만 허용 유효 세션이면 홈으로 차단
LAWYER 허용 허용 허용 로스쿨 전용 게시판만 차단 허용 유효 세션이면 홈으로 차단
LAWSCHOOL 허용 허용 허용 변호사 전용 게시판만 차단 허용 유효 세션이면 홈으로 차단
COMPANY_MANAGER 허용 목록·상세 허용 허용 community-gate 계정·설정·인증만 허용 유효 세션이면 홈으로 차단
ADMIN 모든 미들웨어 경로 통과 통과 통과 통과 통과 통과

추가 판정:

M01 · 홈과 통합검색

단계 화면/동작 연결 근거 판정
1 홈 진입 apps/web/src/app/(main)/page.tsx 코드 확인
2 추천 채용·스펙업·커뮤니티·공지/뉴스 확인 홈 섹션 컴포넌트와 공개 API 호출 코드 확인
3 검색어 입력 apps/web/src/components/home/homeSearch/HomeSearch.tsx 코드 확인
4 비로그인이면 /signin?returnTo=/search?... 홈 검색의 clientRole 쿠키 판정 코드 확인
5 로그인 상태면 /search에서 채용·스펙업·커뮤니티 결과와 탭 제공 apps/web/src/app/(main)/search/page.tsx 코드 확인

검색 이벤트에는 화면 위치·결과 종류 같은 메타데이터를 기록하지만 검색어 본문을 이벤트 속성으로 직접 넣지 않는 코드가 확인된다.

M02 · 채용정보

지원 화면 apps/web/src/components/jobDescriptionDetail/jobDescriptionProfile/JobDescriptionProfile.tsx, 지원 서비스 apps/web/src/services/applicationService.ts, 지원 API apps/server/src/lawyer/job-application/job-application.controller.ts를 대조했다.

지원 방식 사용자 흐름 서버 기록 권한/조건
내부지원 상세 → 승인된 자격 확인 → 이력서 선택 → 첨부 자동 준비/선택 → 개인정보 제공 동의 → PENDING 지원 생성 → 파일 업로드 → complete 확정 → 지원현황 지원행, 선택 이력서 ID, 제출 파일, 동의 이력, 완료 상태 LAWYER/LAWSCHOOL(및 ADMIN API), 승인된 자격, 진행 중 공고
이메일지원 상세 → 로그인/역할 확인 → 이메일 주소 클립보드 복사 → apply-click 계측 지원 클릭 및 분석 이벤트 변호사/로스쿨만 UI 허용
외부링크 상세 → 로그인/역할 확인 → 새 탭 외부 URL → apply-click 계측 지원 클릭 및 분석 이벤트 변호사/로스쿨만 UI 허용

내부지원은 업로드 중 끊겨도 같은 모달에서 이미 성공한 단계를 건너뛰고 재개하도록 구성되어 있다. 확정 뒤에는 /mypage/applications에서 지원·취소·마감 상태와 제출 파일을 확인하고 지원을 취소할 수 있다. 채용 목록/상세 조회 API는 공개지만, 화면 미들웨어가 비로그인 상세 열람 횟수와 미인증 USER의 접근을 추가로 제한한다.

M03 · 스펙업

스펙업 API apps/server/src/lawyer/spec-up/spec-up.controller.ts스크랩 API apps/server/src/lawyer/spec-up/spec-up-scrap.controller.ts를 기준으로 정리했다.

단계 동작 판정
1 /specup 목록과 인기 목록 조회 공개 API, 코드 확인
2 /specup/:id 상세·유사 항목·첨부·지도 확인 공개 API + 비로그인 soft gate, 코드 확인
3 카테고리에 따라 “지원하기” 또는 “자세히 보기” 표시 코드 확인
4 외부링크 새 탭 또는 이메일 주소 복사, apply-click 기록 apply-click API는 LAWYER/LAWSCHOOL/ADMIN, 코드 확인
5 스크랩 추가/해제 → /mypage/scrap/specup 서버 역할은 COMPANY_MANAGER까지 포함, 코드 확인

화면 미들웨어는 COMPANY_MANAGER의 스펙업 접근을 허용하지만 apply-click API는 회사 역할을 허용하지 않는다. 이는 화면 열람과 지원 행동 권한이 분리된 사례다.

M04 · 커뮤니티

커뮤니티 클라이언트 서비스 apps/web/src/services/communityService.ts, 게시글 API apps/server/src/lawyer/post/lawyer-post.controller.ts, 댓글 API apps/server/src/lawyer/comment/lawyer-comment.controller.ts, 신고 API apps/server/src/lawyer/report/lawyer-report.controller.ts를 대조했다.

흐름 동작 권한/분기
읽기 커뮤니티 홈 → 게시판 → 목록 → 상세 비로그인 목록은 gate, 외부 직접 상세 1개는 soft gate
게시 글 작성/수정/삭제, 이미지 presigned URL 발급 → S3 PUT → 성공/실패 상태 반영 직역 역할 중심; 파일 업로드는 한 번 재시도 후 실패 격리
반응 좋아요, 댓글 작성/수정/삭제 로그인·역할 API 확인
신고 게시글 또는 댓글 신고 신고 대상 ID와 사유를 서버에 전송
내 활동 /community/myPost에서 내 글·댓글 확인 로그인 필요
직역 게시판 변호사는 로스쿨 게시판, 로스쿨은 변호사 게시판 접근 차단 /community/home?denied=… 형태로 안내

M05 · 도구

진입 흐름 경계
PDF 도구 헤더 → NEXT_PUBLIC_PDF_URL 또는 /pdf → 별도 앱 router.push가 아닌 전체 페이지 이동. web 미들웨어 범위 밖
추석 인사카드 헤더 → /web-card → nginx가 PDF 앱으로 전달 PDF 도구 하위가 아닌 계절성 최상위 진입점
이력서 PDF 이력서 미리보기 또는 내부지원에서 렌더링/다운로드·첨부 M06 이력서와 M02 지원에 연결

운영 nginx의 실제 현재 라우팅과 계절 메뉴의 종료 시점은 로컬 코드만으로 확정하지 않아 미확인으로 남긴다.

M06 · 내 커리어와 마이페이지

이력서 API apps/server/src/lawyer/resume/lawyer-resume.controller.ts지원 API apps/server/src/lawyer/job-application/job-application.controller.ts를 기준으로 정리했다.

영역 주요 동작 인가
이력서 목록, 새 작성, 편집, 복사, 기본 이력서, 삭제, 미리보기, PDF/ZIP LAWYER/LAWSCHOOL/ADMIN + 승인된 법조 자격 guard + 소유권 확인
이력서 파일 파일 메타 생성, S3 업로드 상태, 이름 변경, 삭제 이력서 소유자 단언 포함
지원현황 지원/취소/마감 집계, 목록, 제출 PDF/첨부 ZIP 다운로드, 지원 취소 본인 memberCode 기준
스크랩 채용·스펙업 탭으로 분리 로그인 역할 API
계정관리 프로필·연락처·관심분야·자격 상태 확인/재인증 로그인 필요
설정 알림 등 계정 설정, 회원탈퇴 로그인 필요

D01 · 가입·인증 데이터 증거

가입 타입 apps/web/src/types/auth.ts, 가입 훅 apps/web/src/hooks/useSignup.ts, 이메일 가입 DTO apps/server/src/auth/member/dto/create-member.dto.ts, 이메일 가입 서비스 apps/server/src/auth/member/member.service.ts, 카카오 서비스 apps/server/src/auth/kakao/kakao-oauth.service.ts, 자격인증 DTO apps/server/src/auth/verification/dto/verification.dto.ts, DB 스키마 prisma/schema.prisma를 대조했다.

이메일 가입

구분 처리/보관
직접 입력 이메일, 비밀번호, 비밀번호 확인, 6자리 이메일 인증코드, 약관 선택 이메일은 DB 저장, 비밀번호는 해시만 DB 저장, 확인값은 비교용, 인증 완료 표시는 Redis 키로 확인 후 삭제
PASS에서 수신 tx, CI, 실명, 휴대폰, 생년월일, 성별 서버가 passTx로 NICE 결과를 다시 조회해 DB 신원을 확정. body의 동명 필드는 호환용이며 신뢰하지 않음
서버 파생 TSID code, 랜덤 nickname, 기본 USER 역할, 생성/수정 시각 DB 저장
동의 만 14세/법정연령, 이용약관, 개인정보, 마케팅, 제안 최신 약관 버전에 대한 동의 이력 저장. 이메일 생성 서비스에는 KAKAO 동의 매핑이 없음
일시 보관 모바일 PASS 왕복 중 이메일·비밀번호·비밀번호 확인·인증코드·인증상태 sessionStorage 가입 초안에 저장 후 복구 시 삭제. 평문 비밀번호가 탭 저장소에 잠시 남는 현재 위험 지점
세션 access/refresh token, 만료시각, 역할/사용자 메타 쿠키·Redis refresh 세션 등 인증 계층에서 처리

카카오 가입/로그인

구분 처리/보관
OAuth 일시 값 authorization code, Kakao access token 서버가 토큰 교환·사용자 조회에 사용. 장기 Member 필드로 저장하는 코드는 확인되지 않음
카카오 계정 응답 Kakao id(필수), email, name 또는 profile nickname, phone_number, gender, birthyear+birthday, CI id 외에는 응답/동의 범위에 따라 선택적. 신규 회원이면 제공된 값만 Member에 저장
정규화 +82 전화번호 변환, gender enum 변환, 생년월일 Date 변환 신규 Member 저장 전에 서버 처리
서버 파생 TSID code, 랜덤 nickname, 기본 USER 역할 DB 저장
기본 동의 이용약관, 개인정보 신규 카카오 회원에 동의=true 이력 생성. 동의 UI·카카오 제공항목의 실제 운영 설정은 미확인
로그인 기록 LOGIN 분석 이벤트, lastAccessAt, LegalCrew access/refresh token DB 분석/최근접속 + Redis refresh 세션

중요: 현행 카카오 경로는 kakaoId로만 기존 회원을 찾는다. 이메일/PASS 가입 계정과 동일인 자동 연결 또는 CI 중복 차단은 이 코드 경로에서 확인되지 않았다. 실제 중복 회원 규모는 운영 DB를 조회하지 않아 미확인이다.

PASS와 법조 자격 인증

단계 정보 결과
PASS 본인확인 tx → CI·실명·휴대폰·생년월일·성별 개인 동일성/기본 신원. 서버 검증 tx만 신뢰
가입 직후 기본 역할 USER 제한된 홈·스펙업 목록·계정·설정·인증 화면
자격 요청 유형(변호사/로스쿨 등), 변호사 자격구분, 회차, 로스쿨명, 인증서류 Verification과 파일 메타/업로드 상태, DRAFT/PENDING/APPROVED/REJECTED/DELETED
승인 LAWYER 또는 LAWSCHOOL 역할과 자격정보 채용 지원·커뮤니티 직역 영역·이력서 기능 활성화
반려/재인증 반려 사유 확인 후 /auth/* 재진입 새 tx/서류로 다시 요청 가능

현행에서 보이는 v3 검토 후보

아래는 확정 정책이 아니라 v3 후보다.

  1. 이메일·카카오를 “로그인 수단”으로 분리하고 PASS CI 기준 동일인 중복 개인 가입을 서버에서 차단한다.
  2. 카카오 신규가입도 약관 버전·선택 동의·제공항목을 명시적인 화면과 감사 이력으로 남긴다.
  3. 모바일 PASS 왕복 시 평문 비밀번호를 브라우저 저장소에 두지 않는 재개 방식으로 바꾼다.
  4. 화면 메뉴 노출, 미들웨어 경로 판정, API 역할, 리소스 소유권을 하나의 정책표와 자동 회귀검사로 연결한다.
  5. 계절성 메뉴와 별도 앱 라우팅에 시작·종료·소유자·장애 시 복구 경로를 둔다.
  6. 자동화율은 성공률뿐 아니라 실패 복구, 사람에게 넘긴 예외, 감사기록 누락률로 측정한다.

미확인 목록