Skip to content

Redis를 이용한 로그아웃 API #124

@dldmldlsy

Description

@dldmldlsy

로그인

  • 액세스, 리프레시 발급
  • key-value : 이메일-리프레시 로 redis에 저장

액세스 만료 시, 리프레시 토큰으로 액세스 재발급

  • refresh 토큰이 DB에 있는지 확인
  • refresh 속 이메일, DB의 해당 리프레시 토큰 이메일 일치 여부 확인
  • refresh 토큰 유효성 검증 검증 -> 실패 시 재로그인 필요
  • 액세스 토큰 재발급

로그아웃

  • 해당 회원의 액세스, 리프레시 모두 무효화(토큰 만료)해야 함 ->
  • 로그아웃 하고 싶은 토큰들을 블랙리스트에 모음
  • 블랙리스트에 토큰이 들어오면 해당 토큰 무효화 진행

Redis 사용하는 이유

  • 유효 기간이 존재하므로 RDBMS에 저장하면 배치를 이용해 주기적으로 삭제해야 함.
  • 주기적으로 삭제하는 번거로움 없어짐
  • 로그아웃 할 때에도 사용 가능

Redis 사용 과정
로그인

  • redis에 리프레시 토큰 저장 (이메일(키), 리프레시토큰(값), 리프레시토큰 유효시간)

로그아웃

  • 액세스 토큰 유효성 검증
  • 액세스 토큰의 이메일 가져와서-> 해당 이메일이 key인 리프레시 토큰이 있을 경우 삭제 (없을 경우는 리프레시 토큰 만료돼서 자동 삭제 된 경우 = 로그아웃 할 필요없음)
  • 액세스 토큰을 블랙리스트로 저장 (액세스토큰(키), "logout"(값), 액세스 토큰 유효시간)
  • 블랙리스트로 등록하는 액세스 토큰에 유효시간을 남은 유효시간 만큼 준다. -> 남은 유효시간동안 블랙리스트로 등록되어있어서 로그인 불가/ 유효시간 이후에 만료되어서 로그인 불가 + 블랙리스트에서도 자동으로 삭제.

우선 할 일

  • redis 설정
  • (로그인) 로그인 시 리프레시 토큰 redis에 저장 (key: 이메일, value: 리프레시 토큰, 유효시간)
  • (로그인) 해당 이메일로 이미 리프레시 토큰이 있다면 새로 발급한 리프레시 토큰으로 변경
  • (로그아웃) 액세스 토큰 유효성 검증
  • (로그아웃) 액세스 토큰의 이메일이 key인 리프레시 토큰 삭제
  • (로그아웃) 액세스 토큰 redis에 저장 (key: 액세스 토큰, value: "logout", 남은 액세스 토큰 유효시간)
  • 회원기능 api접근 시 블랙리스트에 있는 토큰인지 확인하는 로직 추가 (로그아웃한 대상인지)

토큰 재발급 PR merge 후에 할 일

  • 리프레시 토큰 속에 유저정보 넣지 않도록 변경
  • (재발급) 리프레시 토큰이 redis에 있는지 확인
  • (재발급) 받은 이메일, redis의 이메일이 일치하는지 확인 (?????)

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

Status

No status

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions