- 조사 기준 브랜치:
docs/user-current-flow-report - 조사 기준 커밋:
95bda1cad5b86896d289477a02481d05bb8f2423 - 조사일: 2026-09-14
- 범위: 현재
apps/web화면·미들웨어와apps/serverAPI 코드. 운영 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 | 모든 미들웨어 경로 통과 | 통과 | 통과 | 통과 | 통과 | 통과 |
추가 판정:
- 약관·정책 문서는 인증·역할과 무관하게 공개다.
- 역할 우선순위는
LAWYER > LAWSCHOOL > COMPANY_MANAGER > USER다. /pdf는 미들웨어 matcher에서 제외된다.- soft gate는
httpOnly,sameSite=lax, 30분 수명의softgate쿠키에 허용 경로를 기록한다. returnTo에는 쿼리 문자열까지 보존한다.ADMIN의 전면 통과는 화면 미들웨어 동작이다. 개별 API의 리소스 소유권은 컨트롤러·서비스에서 다시 확인해야 한다.
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 후보다.
- 이메일·카카오를 “로그인 수단”으로 분리하고 PASS CI 기준 동일인 중복 개인 가입을 서버에서 차단한다.
- 카카오 신규가입도 약관 버전·선택 동의·제공항목을 명시적인 화면과 감사 이력으로 남긴다.
- 모바일 PASS 왕복 시 평문 비밀번호를 브라우저 저장소에 두지 않는 재개 방식으로 바꾼다.
- 화면 메뉴 노출, 미들웨어 경로 판정, API 역할, 리소스 소유권을 하나의 정책표와 자동 회귀검사로 연결한다.
- 계절성 메뉴와 별도 앱 라우팅에 시작·종료·소유자·장애 시 복구 경로를 둔다.
- 자동화율은 성공률뿐 아니라 실패 복구, 사람에게 넘긴 예외, 감사기록 누락률로 측정한다.
미확인 목록
- 운영 DB에서 이메일/카카오/PASS/자격 필드가 실제로 채워진 비율과 중복 개인 계정 규모
- 카카오 개발자 콘솔에서 현재 동의받는 선택 항목과 동의 화면 문구
- NICE 계약·보관정책 및 tx/결과의 실제 운영 보존기간
- nginx의 현재
/pdf,/web-card라우팅과 계절 메뉴 종료 정책 - 운영 데이터 보존·삭제 기한과 탈퇴 뒤 물리 삭제 시점