로그인 & 로그아웃 & 토근 재갱신 FLOW CHART - Hot-stock/backend GitHub Wiki

시나리오

사용자는 이메일과 비밀번호를 입력해 로그인을 요청하고, 인증에 성공하면 헤더의 쿠키에 session id, access token, refresh token이 발급됩니다.

  1. 사용자 정보 입력: 사용자가 이메일과 비밀번호를 입력하고 /api/v0/user/login에 post로 payload를 전송합니다.
  2. 로그인 완료: 응답이 200으로 오고, 헤더의 쿠키 부분에 session id, access token, refresh token이 발급된다.

프로세스 FLOW CHART

flowchart LR
    A[Client: 로그인 요청] -->|POST /api/v0/user/login| B[LoginController]
    B --> C[LoginService: 사용자 조회 및 인증]
    C --> D{이메일로 사용자 조회}
    D -->|사용자 존재| E[비밀번호 검증]
    D -->|사용자 없음| F[401 Unauthorized]
    E -->|비밀번호 일치| G[TokenUsecase: JWT 생성]
    E -->|비밀번호 불일치| F[401 Unauthorized]
    G --> H[JWTService: JWT 생성 및 세션 저장]
    H --> I[CookieHelper: JWT 쿠키 설정]
    I --> J[로그인 성공 응답]
    F -->|Unauthorized| K[로그인 실패 응답]
  flowchart LR
    A[Client: 토큰 갱신 요청] -->|POST /refresh| B[LoginController]
    B --> C[TokenRefreshCommand 생성]
    C --> D[TokenUsecase: refreshToken으로 access token 생성]
    D --> E{refreshToken 유효성 검사}
    E -->|유효| F[JwtTokenVO 생성]
    E -->|유효하지 않음| G[401 Unauthorized]
    F --> H[CookieHelper: 새로운 토큰을 쿠키에 설정]
    H --> J[성공 응답]
    G -->|Unauthorized| K[갱신 실패 응답]
  flowchart LR
    A[Client: 로그아웃 요청] -->|POST /logout| B[LoginController]
    B --> C[LogoutCommand 생성]
    C --> D[LogoutUsecase: 세션 및 토큰 처리]
    D --> E{로그아웃 성공 여부}
    E -->|성공| F[CookieHelper: 쿠키 삭제]
    E -->|실패| G[400 Bad Request 응답]
    F --> H[200 OK 응답]
    G --> I[로그아웃 실패 응답]

API 설명

스웨거 주소: http://3.34.191.223:8080/swagger-ui/index.html#/

1. POST /api/v0/login

  • 설명: 사용자가 입력한 정보로 로그인을 시도합니다.
  • 요청 데이터:
    • email: 사용자의 이메일 주소 (string)
    • password: 사용자가 설정한 패스워드 (string)
  • 응답 데이터:
    • 200 OK: 성공적으로 로그인 성공
    • 401 Unauthorized: 잘못된 정보로 로그인 시도

2. POST /api/v0/logout

  • 설명: 사용자의 토큰 정보를 폐기합니다.
  • 요청 데이터:
    • sessionId(쿠키 값 사용): 쿠키 값 사용
    • accessToken(쿠키 값 사용): 쿠키 값 사용
    • refreshToken(쿠키 값 사용): 쿠키 값 사용
  • 응답 데이터:
    • 200 OK: 로그아웃 성공
    • 400 Bad Request: 로그아웃 실패

3. POST /api/v0/refresh

  • 설명: 사용자의 access token과 refresh token을 재갱신합니다.
  • 요청 데이터:
    • sessionId(쿠키 값 사용): 쿠키 값 사용
    • accessToken(쿠키 값 사용): 쿠키 값 사용
    • refreshToken(쿠키 값 사용): 쿠키 값 사용
  • 응답 데이터:
    • 200 OK: access token과 refresh token이 모두 갱신
    • 400 Bad Request: access token과 refresh이 모두 폐기

에러 처리 및 예외 상황

UI와 API 호출 흐름

1. 로그인 UI

  • 이메일 입력 필드: 사용자는 이메일을 입력합니다.
  • 비밀번호 입력 필드: 사용자는 비밀번호를 입력합니다.
  • 로그인 버튼: 사용자가 로그인 버튼을 클릭하면, 이메일과 비밀번호를 포함한 로그인 요청이 /api/v0/login API로 전송됩니다.
    • 성공 시: 서버로부터 200 OK 응답이 오면, 헤더에 있는 쿠키에 session id, access token, refresh token이 저장됩니다. 이후, 대시보드 또는 메인 화면으로 리다이렉트됩니다.
    • 실패 시: 서버로부터 401 Unauthorized 또는 400 Bad Request가 반환되면, UI에서 에러 메시지를 표시합니다. 예를 들어, "잘못된 이메일 또는 비밀번호입니다"와 같은 알림을 띄웁니다.

2. 로그아웃 UI

  • 사용자는 UI 상의 로그아웃 버튼을 클릭하면 /api/v0/logout API가 호출됩니다.
    • 성공 시: 200 OK 응답이 오면, 모든 세션 관련 쿠키가 삭제되고 로그인 페이지로 리다이렉트됩니다.
    • 실패 시: 400 Bad Request가 반환되면 UI에서 로그아웃 실패 메시지를 보여줍니다.

3. 토큰 갱신 흐름

  • 사용자가 애플리케이션을 사용하는 동안, 토큰이 만료되기 전에 /api/v0/refresh API를 통해 새로운 access token과 refresh token을 발급받습니다.
    • 성공 시: 새로운 토큰들이 쿠키에 저장되고, 애플리케이션 사용이 계속됩니다.
    • 실패 시: 토큰이 만료되거나 유효하지 않을 경우, 로그인 페이지로 리다이렉트되며, 사용자는 재로그인을 요청받습니다.

테스트 케이스

1. 성공적인 로그인 테스트

  • 설명: 유효한 이메일과 비밀번호로 로그인 시도
  • 기대 결과: 200 OK 응답을 받고, 헤더에 session id, access token, refresh token이 발급됨.
  • 검증 방법: 로그인 후 쿠키에 세션 및 토큰 값이 저장되었는지 확인하고, 대시보드로 리다이렉트되는지 확인.

2. 잘못된 비밀번호 로그인 실패 테스트

  • 설명: 유효한 이메일과 잘못된 비밀번호로 로그인 시도
  • 기대 결과: 401 Unauthorized 응답을 받고, 로그인 실패 메시지가 표시됨.
  • 검증 방법: 에러 메시지가 "잘못된 이메일 또는 비밀번호입니다"로 표시되는지 확인.

3. 이메일 존재하지 않는 사용자 로그인 테스트

  • 설명: 존재하지 않는 이메일로 로그인 시도
  • 기대 결과: 401 Unauthorized 응답을 받고, "등록되지 않은 사용자입니다" 메시지가 표시됨.
  • 검증 방법: 에러 메시지가 정확히 표시되는지 확인.

4. 로그아웃 테스트

  • 설명: 로그인 후 로그아웃 요청
  • 기대 결과: 200 OK 응답을 받고, 모든 세션 쿠키가 삭제됨.
  • 검증 방법: 로그아웃 후 쿠키가 삭제되었는지 확인하고, 로그인 페이지로 리다이렉트되는지 확인.

5. 토큰 갱신 테스트

  • 설명: 만료되기 직전의 액세스 토큰으로 토큰 갱신 시도
  • 기대 결과: 200 OK 응답을 받고, 새로운 access token과 refresh token이 쿠키에 저장됨.
  • 검증 방법: 토큰 갱신 후 쿠키에 새로운 값이 저장되었는지 확인.

6. 토큰 갱신 실패 테스트 (만료된 리프레시 토큰)

  • 설명: 만료된 리프레시 토큰으로 토큰 갱신 시도
  • 기대 결과: 400 Bad Request 또는 401 Unauthorized 응답을 받고, 사용자는 재로그인을 요청받음.
  • 검증 방법: 에러 메시지와 함께 로그인 페이지로 리다이렉트되는지 확인.