Kotlin Filter Error Handling

정명진·2023년 7월 7일
0
post-custom-banner

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)
    }

요약

  1. 기존 SecurityConfiguration 에 jwt authentication 설정 부분을 filter에게 위임함.
  2. jwt exception 발생시 필터에서 처리 되지 않아 계속 전파되다가 servlet 도달하여 결국 사용자 지정 error가 처리되지 않고 servlet default exception이 발생함.
  3. filter를 적용해 해당 문제 해결.
profile
개발자로 입사했지만 정체성을 잃어가는중... 다시 준비 시작이다..
post-custom-banner

0개의 댓글