한 줄 요약
Figma 회원가입·비밀번호 찾기 화면이 실제로 안전하게 동작하도록 비밀번호 재설정 API와 가입 약관 동의 이력을 구현합니다.
화면 기준
- Figma
[PWF] Prototype-WireFrame-3rd의 04_Authentication & Onboarding
- 비밀번호 찾기 → 메일 안내 → 새 비밀번호 입력 → 완료
- 회원가입의 서비스 이용약관·개인정보 처리방침 필수 동의와 마케팅 선택 동의
- 세부 요청·응답 필드는 Notion API 명세를 기준으로 합니다.
소유 API와 변경 계약
회원가입 성공 후 자동 로그인하지 않습니다. Client가 성공 화면으로 이동한 뒤 기존 POST /api/v1/auth/login을 별도로 호출합니다.
비밀번호 재설정 흐름
- 사용자가 이메일을 입력합니다.
- 계정 존재 여부와 관계없이 동일한
202 Accepted 응답을 반환합니다.
- 존재하는 활성 계정이면 일회용 원본 token을 생성하고 DB에는 hash만 저장합니다.
- 메일에는 만료시간이 있는 재설정 링크를 전달합니다.
- 새 비밀번호가 정책을 통과하면 token을 사용 처리하고 비밀번호 hash를 교체합니다.
- 기존 Refresh Token을 모두 폐기하여 다른 기기의 로그인 세션도 종료합니다.
회원가입 동의 이력
기존 가입 요청에 다음 의미의 동의 정보를 추가합니다. 최종 DTO 이름은 OpenAPI와 Notion에서 한 번만 확정합니다.
- 필수: 서비스 이용약관 동의 여부와 version
- 필수: 개인정보 처리방침 동의 여부와 version
- 선택: 마케팅 정보 수신 동의 여부와 version
- 서버 저장:
companyId, userId, 동의 종류, version, 동의 여부, 동의 시각, requestId
- 필수 동의가 없거나 현재 지원하지 않는 version이면 가입을 거부합니다.
- 체크박스 값만
user_account에 덮어쓰지 않고 동의 변경 이력을 별도 record로 남깁니다.
초보자용 구현 순서
- 비밀번호 재설정 token과 동의 이력용 Flyway migration을 작성합니다.
- token 생성·hash·만료 검증을 application Port로 분리합니다.
- 메일 발송은
PasswordResetNotificationPort 뒤에 두어 Provider를 교체할 수 있게 합니다.
- 두 재설정 Controller와 Service를 구현합니다.
- 회원가입 DTO·Service에 동의 검증과 이력 저장을 연결합니다.
- 성공 후 Refresh Token 전체 폐기와 감사로그를 연결합니다.
- OpenAPI 예시와 정상·만료·재사용·rate limit·동시 요청 테스트를 작성합니다.
보안 규칙
- 등록되지 않은 이메일인지 응답 시간·본문·상태코드로 구분할 수 없게 합니다.
- 원본 token, 새 비밀번호, 이메일 원문을 일반 로그와 Issue에 남기지 않습니다.
- token은 일회용·만료 필수이며 DB에는 hash만 저장합니다.
- 재전송에는 cooldown과 사용자·IP 기준 rate limit을 적용합니다.
- 비밀번호는 기존 정책에 맞춰 BCrypt/Argon2 hash만 저장합니다.
- 개발용 메일 Adapter도 원본 token을 운영 로그에 출력하지 않습니다.
완료 조건
이번 이슈에서 하지 않는 것
- 회원가입 직후 자동 로그인
- 소셜 로그인
- 실제 개인정보 원문을 포함하는 메일
- 관리자용 약관 편집 화면
- SMS 비밀번호 재설정
관계
한 줄 요약
Figma 회원가입·비밀번호 찾기 화면이 실제로 안전하게 동작하도록 비밀번호 재설정 API와 가입 약관 동의 이력을 구현합니다.
화면 기준
[PWF] Prototype-WireFrame-3rd의04_Authentication & Onboarding소유 API와 변경 계약
POST /api/v1/auth/password-reset-requestsPOST /api/v1/auth/password-resetsPOST /api/v1/auth/signup에 약관 동의 version·결과 저장 규칙 추가회원가입 성공 후 자동 로그인하지 않습니다. Client가 성공 화면으로 이동한 뒤 기존
POST /api/v1/auth/login을 별도로 호출합니다.비밀번호 재설정 흐름
202 Accepted응답을 반환합니다.회원가입 동의 이력
기존 가입 요청에 다음 의미의 동의 정보를 추가합니다. 최종 DTO 이름은 OpenAPI와 Notion에서 한 번만 확정합니다.
companyId,userId, 동의 종류, version, 동의 여부, 동의 시각, requestIduser_account에 덮어쓰지 않고 동의 변경 이력을 별도 record로 남깁니다.초보자용 구현 순서
PasswordResetNotificationPort뒤에 두어 Provider를 교체할 수 있게 합니다.보안 규칙
완료 조건
이번 이슈에서 하지 않는 것
관계