[Spring] Redis를 활용하여 Refresh Token구현하기

조성현·2023년 2월 10일
0

일반적인(구글링 기준) 방식과 블랙리스트 방식

전제조건 -> [RTR(Refresh Token Rotation] 적용한 상태

  • 유저 한명당 하나씩 레디스에 (가장 최근에 발급받은) refresh token 을 가지고 있는 방식 (로그인, 리이슈시 덮어쓰고 / 로그아웃& 회원탈퇴 시에는 지운다)
  • 블랙리스트 방식
    (로그인시 저장안함 / 리이슈시 발급에 사용한 refresh token을 블랙리스트 등록 / 로그아웃&회원탈퇴 시에는 가져온 refresh token을 블랙리스트에 등록)

어떤 방식이 더 효율적일지 고민해보고 결정해야한다.

  • 보안상 허점은 어떤 것들이 있는지
  • 어떤 방식이 Redis를 더 효율적으로 사용하는지 (데이터 갯수, 접근 빈도 등)
    (일반적인 유저 사이클에서 접근횟수를 각각 체크해보기)

"왜 JWT를 썼지?" 를 잊지말자

JWT를 쓰는 의의는 세션과 달리 DB에 접근을 최소로 한다에 있다.

  • 아님

access token이나 refresh token 둘 다 DB 접근 없이
돌아가도록 구현하는 것이 맞는 방향이 아닐까?

  • access token은 맞는데 refresh token은 jwt로 구현 안하고 UUID같은 값으로 DB에 저장하는 방식을 쓸 수도 있음.

ATK(access token) RTK(refresh token)

  1. 로그인을 하면 ATK와 RTK를 반환한다.
    (body에 주고 프론트에서 알아서 담아주도록)
  2. 30분동안 ATK로 잘 쓰다가 만료가 되면?
  3. RTK를 가지고와서 유효한지 판단하고, 유효하면 ATK랑 RTK를 반환한다.
    (Refresh Token Rotation)
  4. 로그아웃을 하게되면 그때 RTK를 블랙리스트 개념처럼 Redis에 저장하고 혹시 이놈을 들고 오면 혼쭐을 내준다.

이렇게 로직을 짠 이유?
사실 많은 글들에서 로그아웃시 블랙리스트에 ATK를 넣는다.
-> 이거는 사실상 매번 ATK를 사용할 때 마다 블랙리스트 랑 대조해보면서 사용한다는 소리인데... (이럴거면 그냥 세션쓰는게..?)

-> 차라리 30분정도의 ATK 보안을 포기하고 RTK로 블랙리스트를 돌리는게 더 낫지 않나...


어떻게 구현할까?

  1. access token은 지금처럼 jwt로 갓!
  2. access token이 이상하면(기한 만료) 401을뱉고
  3. 프론트가 정신차리고 /reissue 요청(refresh 토큰)을 보낸다.
  4. access token이랑 refresh token을 재발급받고? 행복하게 다시 API 이용하면 된다.
  5. refresh token만 넣어서 그게 db에 있으면? 유효한거라고 판단.

docker run -d -p 6379:6379 redis 
>> -d(백그라운드 실행) / -p(포트 지정) 

...

https://www.youtube.com/watch?v=Gimv7hroM8A&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC

https://youtu.be/BotXDfBPvDA

[Spring Boot와 Redis를 사용하여 Refresh Token 구현하기 - Hudi]

https://hudi.blog/refresh-token/

https://auth0.com/docs/secure/tokens/refresh-tokens/refresh-token-rotation
https://auth0.com/blog/stateless-auth-for-stateful-minds/#The-Benefits-of-Going-Stateless

https://sehajyang.github.io/2019/12/11/how-to-operate-redis/
https://jistol.github.io/docker/2017/09/01/docker-redis/
https://jinane.tistory.com/21
https://hub.docker.com/_/redis

profile
맛있는 음식과 여행을 좋아하는 당당한 뚱땡이

0개의 댓글