로그아웃 기능을 만들다가 고민에 빠졌다.
- 로그아웃을 한 뒤에 이미 블랙리스트에 오른 토큰으로 로그아웃 요청을 또 하여도 여전히 블랙리스트에 같은 토큰을 추가한다.
→ 블랙리스트에 추가하기전에 한번 검색하여 해결
- 다시 비슷한 문제로 존재하지 않는 토큰에 대해서 블랙리스트에 추가를 요청하면 그대로 들어가는 문제 발견
두가지 생각이 있다.
1. 막을 필요 없다 : 어짜피 프론트에서 없는 엑세스 토큰으로 로그아웃 요청을 할리가 없다.
2. 막아야한다 : 의도적으로 가짜 토큰을 만들어서 내 서비스의 헛점을 찾으려하거나 DB값으로 금전전 공격을 할 수 도 있다.
거기에 이미 블랙리스트에 있는 토큰인지 없는 토큰인지 확인했다면 여기까지 가도된다..
평소에도 DB조회를 한번 더하는 비용 vs 어쩌다한번 이상한 놈한테 걸려서 DB에 부하(?)가 걸리는것 어느게 더 비싼걸까?에 대한 생각과 팀원과의 토론이 필요하다.
2023 11 30 추가
- 블랙리스트라는 테이블을 따로 관리하기 보다는, 엑세스, 리프레시 토큰의 테이블에 isWithdrawl이라는 컬럼을 추가했다.
- 두 토큰의 jti가 같기 때문에 로그아웃 요청을 할때 jti만 받게 만들었다.
- 이렇게해서 테이블을 하나 줄여서 테이블간의 참조가 줄어들었고, 실제로 존재하는 토큰인지, 이미 무효화된 토큰인지 확인하는 과정이 매우 빨라졌다.