본문 바로가기

[SpringSecurity 뜯어보기] oAuth2 Resource 라이브러리와 Custom JWT 간의 호환

by 흐리멍텅 2025. 1. 15.

( https://nakhwa.tistory.com/51 게시글과 이어집니다. )

oAuth2 리소스 서버 라이브러리를 활용한 기존 JWT 처리 Process

기존 SecurityConfig 에서의 JWT 처리방식

 

기존 SecurityConfig 의 FilterChain의 일부로, oauth2ResourceServer 를 사용하고 있으며, jwt 관련 Custom 설정은 jwtAuthConverter 만 존재한다. 동작방식은 이전글에서 자세히 살폈으니 넘어가고, Custom Jwt 로직을 추가하는데 있어서 문제점이 발생하였다.


Jwt  Decord  값이 Filter를 거쳤을 때와, 직접 Decord 테스트를 진행했을 때 다르다.

위의 두 메소드는 각각 Custom JWT 를 생성하는 메소드와, 테스트에서 해당 JWT 를 Decord 하는 메소드이다. 물론 테스트는 정상적으로 동작했다.

하지만 실제로 SecurityFilter를 거치며 JWT 에서 권한을 추출해서 사용하는 테스트의 경우, 위 테스트 뿐 아니라 여러 시나리오 전부 실패했다.


JJwt 라이브러리와 OAuth2 Resource 라이브러리는 알고리즘이 다르다.

JwtBuilder signWith(Key key) throws InvalidKeyException; 메소드에서 확인할 수 있는 설명 중 일부이다. 키의 종류와 크기에 따라 자동으로 추천 알고리즘이 선택된다는 내용이다.

 

하지만 OAuth2 Resource 라이브러리에서는 Jwt 를 NimbusJwtDecoder 를 활용하고 있으며,
NimbusJwtDecoder의 내부를 살펴보면 

기본적으로 RS256 비대칭 키 방식을 사용하고 있기에 대칭키방식의 HS256 알고리즘을 사용하는 JwtBuilder를 해독 시도할 경우, 실패하게 된다.


간단한 해결책 - Decoder 를 지정해주면 된다.

차례대로 SecurityConfig 에서 Decoder 주입 -> 해당 Decoder 내용 -> NimbusJwtDecoder 내부 내용이다.

정말 고맙게도(?) NimbusJwtDecoder 는 secrectKey를 하나만 사용하게 될 경우 HS256 알고리즘을 활용하도록 지원하고 있으며, 이 방식은 Custom Jwt 에서 사용한 알고리즘과 동일하기에 "같은 키"를 "같은 알고리즘"에서 사용할 수 있게되어 결과적으로 호환 가능한 상태가 된다.

 

이후 테스트는 성공 :)