Skip to content

[FEAT] 비밀번호 갱신 기능 #223

@Be-HinD

Description

@Be-HinD

✨ 요청 기능 설명

사용자가 비밀번호 갱신 기능을 통해 새로운 비밀번호로 변경할 수 있는 기능

🔍 해결해야 하는 문제

사용자는 아래와 같은 유스케이스를 통해 비밀번호 재발급을 수행할 수 있어야 한다.

  • 사용자 이메일 입력 및 비밀번호 갱신 POST 요청
  • 서버는 사용자 이메일 검증 및 갱신 페이지 URL을 본문에 담은 이메일 전송 (보안을 위한 1회성 검증값을 URL 쿼리 파라메터에 추가)
  • 사용자는 비밀번호 갱신 페이지에서 새로운 비밀번호 입력 및 변경 POST 요청
  • 서버는 검증값의 유효성을 판단하고, 유효할 시 비밀번호 변경 및 검증값, 세션 폐기

🧩 구현 아이디어

1회성 검증값의 경우에는 Redis TTL 30분을 적용하여 UUID를 사용한다. (갱신 성공 시 폐기)
저장 데이터 구조: Key: [validationValue] / Value: [Email] 형식으로 저장
※ 요청을 여러 번 할 경우 가장 최근의 토큰만 유효하게 관리

이메일을 통해 비밀번호 갱신 페이지에 접근할 경우 2단계 검증 도입

  1. 프론트에서는 쿼리 파라메터의 검증값 유효성 API를 호출하여 검증
  2. 비밀번호 제출 시 검증값 재검사

구현 API 리스트


  1. 비밀번호 갱신 요청 API

POST /api/v1/auth/password-reset/request
RequestBody
{
"email": "user@example.com"
}

Response

  • 가입된 이메일 : 200OK 및 메일 발송
  • 미가입 이메일 : 404 Not Found

주요 로직

  • 이메일 존재 여부 검증
  • 검증 UUID값 생성 및 Redis TTL 저장
  • 이메일 발송 SMTP 프로토콜 적용
    • 이메일 본문 : {프론트 URL}?validationValue={검증값}

  1. 검증값 유효성 검사 API
    GET /api/v1/auth/reset-verify
    RequestParam = {validationValue}

Response

  • 유효 : 200 OK
  • 무효 : 400 Bad Request

  1. 비밀번호 변경 요청 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status

    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions