현재 이메일 인증, 회원가입 기능, 로그인 등이 구현이 되었고 로그아웃 차례가 왔다.
내가 로그아웃 글을 쓰는건 로그아웃을 할때 AccessToken을 블랙리스트 처리하는 과정이 신기하면서도
특별한 경험이었다고 생각했기 때문이다.
현재 AccessToken은 로그인시에 클라이언트에 저장하고
RefreshToken은 Redis에 로그인 한 사람의 이메일과 key:value로 저장되어 있는 구조이다.
처음에는 그냥 Redis에서 RefreshToken을 삭제해서 로그아웃을 시켜야겠다고 생각했지만
그러고보니 현재 AccessToken의 유효기간이 끝나기 전엔 로그인이 된다는 것이다.
그래서 로그아웃 처리된 AccessToken을 남은 기간동안 Redis에 저장해서
블랙리스트 처리하여 로그아웃을 했지만 클라이언트에 남은 AccessToken으로
로그인을 하지 못하게 서버에서 막도록 할 것이다!!
말이 헷갈릴 수 있는데 그림으로 보면
이런느낌이다.
이해가 더 안되려나 ^_^
쨌든 계획은 이렇다!
일단 로그인을 하고 레디스에 RefreshToken이 생긴걸 확인해보자 !!
생각대로 레디스에 잘 들어갔다
이제 로그아웃을 진행할건데 로직부터 보자.
public void logout(HttpServletRequest request) {
// jwtUtil에 구현한 header에서 access_token빼오기
String accessToken = jwtUtil.extractAccessToken(request);
// 토큰 검증
if (accessToken == null || !jwtUtil.validateAccessToken(accessToken)) {
throw new IllegalArgumentException("유효하지 않은 토큰입니다.");
}
// 남은 시간과 이메일 추출
long expiration = jwtUtil.getAccessTokenExpireTime(accessToken);
String email = jwtUtil.getEmailFromAccessToken(accessToken);
try {
// 레디스에 로그아웃 진행된 access_token 블랙리스트 저장
redisService.setValue("access_token_blacklist:" + accessToken, "logout", Duration.ofMillis(expiration));
// refresh_token 삭제
redisService.deleteValue("refresh_token:" + email);
} catch (Exception e) {
throw new IllegalArgumentException("로그아웃에 실패했습니다. 관리자에게 문의해주세요.");
}
}
로그아웃 메서드 로직인데 혹시 다른 메서드가 궁금하면 댓글에 물어봐주세요!
이 메서드를 보면 로그아웃이 성공할시에 access_token 블랙리스트로 redis에 추가
아까 있던 refresh_token삭제가 진행되어야 한다.
해보겠다.
성공 ~
레디스 확인해보자
모든 키를 조회했는데 아까 있던 리프레쉬 토큰 사라지고 blacklist로 엑세스 토큰이 들어왔다.
그럼 로그인 할때 지금 저장된 access_token을 사용한다면 로그인을 다시 해달라고 하면 된다!
'Project > mo:rack (익명 커뮤니티)' 카테고리의 다른 글
게시글 조건 조회 - QueryDSL (동적 쿼리) feat. 페이징 (2) | 2025.06.15 |
---|---|
게시글의 댓글을 어떻게 불러와야 할까? - N+1 문제의 늪(1) (0) | 2025.06.12 |
Google SMTP로 이메일 인증 구현하기 (2) | 2025.06.05 |
DB 수정사항 + Token들 저장 위치 결정 (이유) (1) | 2025.06.04 |
프로젝트 방향, ERD 설계, 프로젝트 개발 시작 (0) | 2025.05.27 |