23년 1월 4일 팀 프로젝트
리프레쉬 토큰을 구현했다.
로그인을 할때, 유저DB에 리프레쉬 토큰을 저장하고, 클라이언트에게 리프레쉬 토큰을 발급하게 한 뒤, 액세스 토큰 만료시 클라이언트의 리프레쉬 토큰과 DB의 리프레쉬 토큰을 비교하게 하고,
이때, DB의 리프레쉬 토큰이 유효하고, 클라이언트가 보낸 리프레쉬 토큰과 일치하면 액세스 토큰을 재발급하도록 구상을 했다.
팀 프로젝트의 스프링 시큐리티에서 jwt를 통한 인증은 OncePerRequestFilter를 상속받은 jwtAuthFilter 클래스에서 하게 해놓았는데, 이 때문에 jwt를 통한 인증은 무조건 jwtAuthFilter를 거쳐야하기 때문에 리프레쉬 토큰 검증 로직은 jwtAuthFilter에서 구현하게 되었다.
구현하면서 생겼던 문제점은
1. 유저 db에 리프레쉬 토큰이 저장되지 않았다.
알고보니 @Transactional(ReadOnly = true)를 걸어놔서 저장이 되지 않았던 것이었다.
2. 토큰에서 유저정보를 받아오는데 계속 토큰이 만료되었다면서 로직이 실행되지 않았다.
정말 간단하고도 어이없는 문제였는데, 토큰이 만료되면 실행되는 로직인 주제에 만료된 토큰에서 유저정보를 받아오려 했기에 생겼던 문제였다. 리프레쉬 토큰에서 정보를 받아오는 것으로 수정했다.
이정도 문제가 있었고, 처리해주지 않은 예외에 대해서 에러페이지를 뱉기도 했는데, 이는 그냥 try catch로 익셉션을 잡아 처리해 주었다.
리프레쉬토큰을 클라언트에게 발급해 줄때, 안전한 공간에 저장을 한다는데, 안전한 공간이란 것을 이해를 못해서 일단 헤더에 저장하게 했다.
헤더에 저장하는 것 이외에 쿠키에 저장하는것도 시도해보았는데 토큰의 길이가 너무 길어 들어가지 않았다.
좀 더 시도해서 알아보고 적용해보아야 하는 사항인것 같다.