오늘 유광열 튜터님과 개인 면담이 있었고, 면담 중 나온 주제 중 하나에 관해 흥미로운 팁을 하나 공유해주셨다.
JWT 토큰 만료 처리에 관한 것이었는데 그 팁에 대한 기록을 남겨보고자 한다.
jwt 토큰 탈취되었을 때, 만료 처리를 어떻게 할 수 있을까
우선 토큰에 대한 정책부터 정의를 해보면 좋을 것이다. 크게 2가지 정책이 있을 수 있다.
- 토큰을 단일로 유지하는 경우
- 여러명의 동시 접속을 막아야 하는 경우
- 여러 기기에서 토큰을 여러개 쓰는 경우
- 카카오톡 처럼 피씨, 폰 둘 다 로그인이 가능해야 하는 경우
- 이런 경우엔 블랙리스트/화이트리스트로 캐싱해야 할 데이터가 너무 많아지는 단점이 있다.
- 혹은 디비에 저장한다면? 이건 더 별로다. 디비 리소스 낭비에 가깝다. 그리고 jwt 사용하는 이유가 없어진다.
그럼 이 두가지 정책 모두를 아우를 수 있는 토큰 만료 방안이 어떤 게 있을까?
여기에 대한 튜터님의 팁은 아래와 같았다.
- 레디스에 유저 아이디를 key 값으로 해서, value에 토큰 만료를 수행하는 시점의 시간을 저장해주는 것이다.
유저아이디:2025-03-02T15:30:45.123(문제가 있을 때만 저장, 만료 요청이 들어온 당시의 시간값 혹은 timestamp)
- 그리고 jwt 토큰이 들어오면 항상 레디스를 조회한다.
- 리턴된 결과가 null이면 토큰은 정상
- 리턴된 결과가 시간 값이고, 토큰 생성 시간이 레디스에 있는 시간보다 이전이면 비정상 처리!!!
- 여기에 더해 예를 들어, 액세스 토큰이 30분 유효시간이고, 리프레시 토큰의 유효시간이 7일이라고 가정해본다.
- 이러한 정책에 따라, 레디스 데이터에 유효시간(ttl)을 설정해서 데이터 관리를 최적화해 줄 수 있을 것이다.
- 액세스 토큰의 만료만 고려한다면, 레디스에서 데이터를 30분 뒤에 삭제하면 될 것이고, 리프레시 토큰 까지하면 7일 뒤에 삭제하여 최적화 할 수 있을 것이다.
- 이러한 정책에 따라, 레디스 데이터에 유효시간(ttl)을 설정해서 데이터 관리를 최적화해 줄 수 있을 것이다.
추가로 주신 jwt 를 이용한 인증에서 유저 정보 관리 팁
- 인증, 인가 목적 (이 가게가 이 사람 것이 맞는지, 이 비즈니스를 할 권한이 있는지) -> JWT 토큰에서만 정보를 가져오는 것으로 해결한다.
- jwt : 인증 주체를 유저에게 위임한다
- 실제로 write 작업이 있는 경우에만 db에서 조회해와서 처리한다.
'Today I...' 카테고리의 다른 글
[TIL] 도메인 주도 설계(DDD) 개론 (1) | 2025.02.27 |
---|---|
[TIL]오늘의 노트 (0) | 2025.02.20 |
[TIL]오늘의 노트 (0) | 2025.02.19 |
[TIL]오늘의 노트 (0) | 2025.02.18 |
오늘의 노트 (0) | 2025.02.16 |