티스토리 뷰

 

이전 포스팅을 통해 JWT 토큰의 생성과 검증을 담당하는 JwtUtil을 작성했다.

https://ekeprl.tistory.com/64

 

[Spring Security - JWT] (2) : JwtUtil

https://ekeprl.tistory.com/63 [Spring Security - JWT] (1) : SecurityConfig 설정https://ekeprl.tistory.com/62 [Spring Security] 세션 기반 vs JWT 기반https://ekeprl.tistory.com/30 Spring Security (1)Spring boot : 3.1Spring Security6Kotlin Spring secu

ekeprl.tistory.com

 

 

이번 포스팅은 매 요청마다 JWT 토큰을 검증하는 JwtFilter를 작성해보려 한다.

 

1.JwtFilter

@Component
class JwtFilter(
    private val jwtUtil: JwtUtil
) : OncePerRequestFilter() {

    override fun doFilterInternal(
        request: HttpServletRequest,
        response: HttpServletResponse,
        filterChain: FilterChain
    ) {
        val token = resolveToken(request)

        if (token != null && jwtUtil.validateToken(token)) {
            val userId = jwtUtil.getUserId(token)
            val auth = UsernamePasswordAuthenticationToken(
                userId, null, emptyList()
            )
            SecurityContextHolder.getContext().authentication = auth
        }

        filterChain.doFilter(request, response)
    }

    private fun resolveToken(request: HttpServletRequest): String? {
        val bearer = request.getHeader("Authorization") ?: return null
        return if (bearer.startsWith("Bearer ")) bearer.substring(7) else null
    }
}

 

2. 주요 동작 설명

 (1) OncePerRequestFilter

private val jwtUtil: JwtUtil
) : OncePerRequestFilter() {

매 요청마다 한 번씩만 실행되도록 OncePerRequestFilter()를 상속받아 작성했다.

 

 (2) resolveToken

private fun resolveToken(request: HttpServletRequest): String? {
    val bearer = request.getHeader("Authorization") ?: return null
    return if (bearer.startsWith("Bearer ")) bearer.substring(7) else null
}

요청 헤더의 Authrization값에서 토큰을 추출한다.

단, Bearer 로 시작하는 경우에만 토큰을 파싱 하고, 그 외의 값은 null을 반환하도록 작성했다.

 

(3) doFilterInternal

val token = resolveToken(request)

if (token != null && jwtUtil.validateToken(token)) {
    val userId = jwtUtil.getUserId(token)
    val auth = UsernamePasswordAuthenticationToken(
        userId, null, emptyList()
    )
    SecurityContextHolder.getContext().authentication = auth
}

filterChain.doFilter(request, response)

추출한 토큰이 유효한값일 경우, UsernamePasswordAuthenticationToken을 생성해 SecurityContextHolder에 등록한다.

이후 Spring Security는 이 인증정보를 바탕으로 요청을 처리한다.

 

*토큰이 없거나, 유효하지 않은 경우에는 인증 정보를 등록하지 않고 다음 필터로 넘긴다.

 

이상 JwtFilter 작성을 알아보았습니.

다음 포스팅은 로그인 API 작성 및 Postman 테스트를 진행해보려 합니다.

감사합니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함