Facts
✅ 만료된 토큰 처리
Findings
문제점
현재 서버에서 토큰이 만료된 경우 IntelliJ 터미널 창에 예외 처리가,
프론트단에서는 Console에 401 오류가 뜨고 있다.
문제점은 401 오류가 로그인 정보가 없거나, 올바르지 않은 로그인 정보를 가진 경우에도
똑같이 401 오류로 다뤄지고 있다.
그래서 401 오류에 대한 응답을 받더라도 프론트 입장에서는 권한이 없음 정도만 알 수 있지만,
JWT 토큰이 잘못 된 것인지, 사용자의 인증을 위한 정보를 잘못 입력한건지, JWT 토큰이 만료된 것인지에
대한 자세한 정보를 알 수 없었다.
토큰이 만료됐으면, LocalStorage에 토큰을 삭제하고, 로그인 페이지로 이동시켜
사용자에게 토큰이 만료되었다고 알려주고 싶은데 이런 처리를 할 수 없다.
따라서, 401 오류에 대한 세분화된 오류 메세지를 프론트단으로 넘길 로직이 필요하다.
- 토큰이 만료된 경우
- 로그인 정보가 틀렸을 경우
- 유효하지 않은 토큰의 경우 (잘못된 형식)
문제 원인
현재 서버에는 JWT 인증 과정 절차를 밟던 중 예외가 발생해 사용자 인증을 하지 못하면,
security > AuthenticationEntryPoint에 의해 401 상태를 리턴하도록 되어 있었다.
그리고, 401 오류에 대한 예외 처리는 security > JwtAuthenticationFilter에서 하고 있다.
토큰 만료, 토큰 정보 불일치, signature에 대한 예외는 모두 로그에만 내용을 남기고 있고,
프론트로 내려줄때 메시지는 "Unauthorized"로 동일하게 처리된 상태다.
해결
401 오류를 세분화되게 예외 처리할 로직이 필요하다.
- 토큰이 만료된 경우
- 로그인 정보가 틀렸을 경우
- 유효하지 않은 토큰의 경우 (잘못된 형식)
🤔 Exception 처리를 하기 위해, 어떻게 해주면 될까?
처음에는 Exception 처리를 위해서, @ControllerAdvice와 ExceptionHandler를 사용해,
예외를 전역적으로 처리해주려고 했는데
Spring의 Exception 처리하는 방법을 공부하면서
Filter에서 발생하는 예외는 다른 방법을 사용해야한다는 것을 알게 되었다.
📚 Spring 예외 발생 위치와 각각 처리 방법
Spring에서는 예외 발생하는 위치가 크게 2가지가 있고, 각각의 처리방법이 다르다.
Filter는 예외가 발생하면, Spring Context에서 처리되는 것이 아니기 때문에
Web Application에서 처리해줘야 한다.
Spring Security의 경우, 토큰을 검증할 때 예외가 발생하면 Spring Context 전에 필터링한다.
그렇기 때문에 Spring Security 내부에서 발생한 예외는 Web Application에서 처리해줘야 한다.
🤔 Web Application 레벨에서 예외 처리할 수 있는 방법은?
- web.xml에 error-page를 잘 등록해줘서 에러를 사용자에게 응답하는 방법이 있다.
- Filter 내부에서 예외를 처리하기 위한 필터를 따로 둬서
try-catch문을 사용하여 예외 처리하는 방법이 있다. - Filter 내부에서 try-catch 구문을 통해 예외 발생 시, HandlerExceptionResolver를 빈으로 주입받아
@ExceptionHandler에서 처리하는 방법이 있다.
이 방법은 필터에서 발생하는 예외를 DispatcherServlet의 예외 처리기인
HandlerExceptionResolver에 보내서 처리하는 방식이다.
💡 토큰 검증 시 발생하는 예외 처리 → 예외를 처리하기 위한 필터를 하나 더 만들어 예외처리 하자
위의 3가지 방법 중 예외를 처리하기 위한 필터를 따로 만들고,
필터는 try-catch문을 사용하여, 예외 처리는 방법을 선택했다.
위의 방법을 사용한 이유는 인증/인가와 관련된 Filter들을 패키지로 묶어 따로 분리해서 관리해줄 수 있기에,
확장성이 좋다고 생각이 들어 선택했다.
참고 자료
토비의 스프링 3.1
'Project > TIL, WIL' 카테고리의 다른 글
TIL(56) 회원가입 중복 아이디 예외처리 추가, 알고리즘 문제 해결 스터디 시작 (0) | 2021.12.27 |
---|---|
TIL(55) AWS RDS 연동하면서 발생한 에러 고치기 (0) | 2021.12.27 |
TIL(54) GithubAction + ElasticBeanstalk + Docker + AWS ECR로 CI/CD 하면서 발생한 에러 고치기 (0) | 2021.12.27 |
TIL(53) JPA 연관관계 에러 고치기 (0) | 2021.12.27 |
TIL(52) Elasticbeanstalk에 HTTPS를 연결 (0) | 2021.12.27 |