-
Notifications
You must be signed in to change notification settings - Fork 0
Description
✨ 요청 기능 설명
사용자가 비밀번호 갱신 기능을 통해 새로운 비밀번호로 변경할 수 있는 기능
🔍 해결해야 하는 문제
사용자는 아래와 같은 유스케이스를 통해 비밀번호 재발급을 수행할 수 있어야 한다.
- 사용자 이메일 입력 및 비밀번호 갱신 POST 요청
- 서버는 사용자 이메일 검증 및 갱신 페이지 URL을 본문에 담은 이메일 전송 (보안을 위한 1회성 검증값을 URL 쿼리 파라메터에 추가)
- 사용자는 비밀번호 갱신 페이지에서 새로운 비밀번호 입력 및 변경 POST 요청
- 서버는 검증값의 유효성을 판단하고, 유효할 시 비밀번호 변경 및 검증값, 세션 폐기
🧩 구현 아이디어
1회성 검증값의 경우에는 Redis TTL 30분을 적용하여 UUID를 사용한다. (갱신 성공 시 폐기)
저장 데이터 구조: Key: [validationValue] / Value: [Email] 형식으로 저장
※ 요청을 여러 번 할 경우 가장 최근의 토큰만 유효하게 관리
이메일을 통해 비밀번호 갱신 페이지에 접근할 경우 2단계 검증 도입
- 프론트에서는 쿼리 파라메터의 검증값 유효성 API를 호출하여 검증
- 비밀번호 제출 시 검증값 재검사
구현 API 리스트
- 비밀번호 갱신 요청 API
POST /api/v1/auth/password-reset/request
RequestBody
{
"email": "user@example.com"
}
Response
- 가입된 이메일 : 200OK 및 메일 발송
- 미가입 이메일 : 404 Not Found
주요 로직
- 이메일 존재 여부 검증
- 검증 UUID값 생성 및 Redis TTL 저장
- 이메일 발송 SMTP 프로토콜 적용
- 이메일 본문 : {프론트 URL}?validationValue={검증값}
- 검증값 유효성 검사 API
GET /api/v1/auth/reset-verify
RequestParam = {validationValue}
Response
- 유효 : 200 OK
- 무효 : 400 Bad Request
- 비밀번호 변경 요청 API
POST /api/v1/auth/password-reset
Request Body
{
"token": "uuid-string",
"newPassword": "safe-password-123"
}
Response Body
- 토큰 유효 : 200 OK
- 토큰 무효 : 400 Bad Request
주요 로직
- Redis 검증값 폐기
- 사용자 비밀번호 변경
- 기기 세션 폐기 (current_sessionid = null)
📌 작업 범위 (선택)
- API 필요 여부
- UI/UX 변경
- 문서 업데이트 필요 여부
📝 비고
보완사항 (적용 여부 검토 필요)
비밀번호 갱신 요청 API의 응답에 404 Not Found로 내릴 경우, 공격자가 특정 이메일의 가입 여부를 확인할 수 있는 통로가 될 수 있음.
개선안 : 이메일 존재 여부와 상관없이 202 Accepted 또는 200 OK 반환 및 메시지를 통해 이메일 가입이 되어 있다면 안내 메일이 발송됩니다. 로 사용자에게 알림
단점 : 사용자가 이메일을 잘 입력했다고 생각하고 계속해서 이메일을 기다리는 나쁜 UX가 그려질 수 있음.
Redis 검증값 키/값 설계
[validationValue] : [email] 구조로 설계할 경우 가장 최근의 토큰만 유효하게 관리 성격을 가질 수 없음.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status