티스토리 뷰

프로젝트에 도입하기 위해 Jwt에 관하여 구글링 해보면 Login까지의 구현은 여러 블로그에 상세하게 잘 나와있다

그러다 Session 방식이 아닌 Jwt 방식을 사용해 로그아웃은 어떻게 구현 가능할까? 라는 호기심이 생겼고

이에 대해서 찾아보니 Redis를 이용해 해결 하는 방법이 있는 것 같다

 

로그아웃 요청 흐름을 보면 아래와 같이 이루어진다

1. 로그아웃 요청

2. 레디스에 액세스 토큰 넣음

3. 사용자가 기존 토큰으로 요청 시 JwtFilter에 있는 validate 과정에서 redis로 해당 accessToken 있는지 확인

4. 레디스에 값이 있으면 요청 거부, 없으면 요청 승인

 

AuthService에 위치한 logout() method

SecurityContext를 비우고 accessToken에 prefix를 붙여 토큰 값을 그대로 넣어준다

누가 로그아웃을 했는지 확인하려면 value에 username을 넣어도 되지만

굳이 확인할 필요가 없어 token 값을 넣어주는 것으로 끝냈다

단 여기서 key 값에 username을 넣을 시 멀쩡한 회원도 요청이 막히기 때문에 key에는 token 값을 넣어주도록 한다

 

 

 

 

redis에 넣을 때, prefix를 붙여주는 이유는 아래 사진과 같이 하나의 폴더처럼 관리하기 위해 붙인 것이다

prefix:key 형태로 넣어주면 prefix에 넣은 값을 폴더명처럼 만들어준다 나는 간단하게 logout을 prefix로 설정했다

token 값이 무지막지하게 긴 이유는 RSA 4096 bits의 private key를 사용해 암호화하기 때문이다

 

 

 

setDataExpire()는 유효기간 설정을 할 수 있는 api로 나는 RedisUtil 클래스에서 StringRedisTemplate을 주입받고 

this.stringValueOperations = stringRedisTemplate.opsForValue();

opsForValue()를 이용해 redis에 접근하는 stringValueOperations를 얻는다

stringValueOperations의 set() 메서드에는 long type으로 유효기간을 받을 수 있기 때문에 

accessToken 관리에 아주 적합하다

accessToken의 최대 유효 시간인 30분에 맞춰 레디스에 넣어주고 그 이후에는 자동으로 삭제된다

왜 30분에 맞춰서 넣냐 하면 내가 정한 정책에서는 액세스 토큰은 30분의 만료 기간을 갖고 있다

따라서 30분이 지나면 어차피 해당 액세스 토큰은 만료되고 재발급받아야 하므로 그 시간이 지나면

레디스에서 관리할 필요가 없기 때문에 최대 유효시간으로 넣어주는 것이다

 

 

 

JwtFilter에서 token을 확인하는 메서드는 isBlocked(), isValid()로 이루어져 있다

isValid()는 일반적인 Jwt의 토큰 확인 과정을 담은 메서드다

isBlocked()는 레디스에서 토큰 값을 확인해서 있는지 찾아 레디스에 값이 존재하면 로그아웃을 한 것이므로

true를 반환해주고 값이 존재하지 않는다면 로그아웃 하기 전의 상태니 false를 반환해준다

 

 


2022. 03. 06

 

해당 소스만 보고 싶으신 분들께는 죄송하지만 없는 것보단 나을테니 전체 코드 레포를 첨부합니다

RedisService, AuthService, TokenCreator 위주로 찾아보시면 됩니다

클론 뜨더라도 application.yml 과 같은 설정 파일이 없기 때문에 돌아가진 않을 것이고 코드 파악 용도로 사용하시면 됩니다

 

 

GitHub - Ryu-JeongMoon/woomool-market

Contribute to Ryu-JeongMoon/woomool-market development by creating an account on GitHub.

github.com

 

댓글
링크
글 보관함
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday