Kotlin with JWT Error
프론트에서 연락이 왔다. JWT 만료 에러인데 문구가 INTERNAL_SERVER_ERROR로 온다고...
왜인가 분석 했더니 기존 SecurityConfig에
http.oauth2ResourceServer().jwt()
http.authenticationManager { auth ->
val jwt = auth as BearerTokenAuthenticationToken
val user = tokenService.parseToken(jwt.token) ?: throw ApiException(401, "Invalid token")
UsernamePasswordAuthenticationToken(user, "", listOf(SimpleGrantedAuthority(UserRole.ROLE_USER.toString())))
}
authentication을 설정했던게 화근이었다.
filter에서 에러가 발생했는데 처리하는 로직이 없어 결국 전파되다가 servlet에 도달하여 servlet error가 발생한것이었다. 왜 그런가 했더니 filter 자체에서 발생한 에러라 @ExceptionHandler는 도달할 수 없는 범위여서 그랬던것이다...
그래서 Filter에서 authentication을 진행하고 exception을 캐치하도록 변경했다. 그랬더니 성공적으로 커스텀 에러를 던질 수 있었다!
{
try {
val token = tokenService.parsePrefix(request.getHeader("Authorization"))
val userId = tokenService.parseToken(token)
UsernamePasswordAuthenticationToken.authenticated(userId, "", listOf(SimpleGrantedAuthority(UserRole.ROLE_USER.toString())))
.apply { details = WebAuthenticationDetails(request) }
.also { SecurityContextHolder.getContext().authentication = it }
} catch (e: Exception) {
request.setAttribute("exception", e)
}
filterChain.doFilter(request, response)
}
요약