인프런 커뮤니티 질문&답변

leese님의 프로필 이미지
leese

작성한 질문수

스프링 시큐리티 OAuth2

연동구현 (2)

Token Decoder

작성

·

366

·

수정됨

0

저는 업무 환경 상 버전이 다르게 진행하고 있고,

org.springframework.boot version "3.2.1"

security version "6.2.1"

개념과 과정을 강의를 통해 도움 받고 있습니다.

궁금한 것은 Authorization Server 에서 강사님이 설정하신 바와 같이 JwtSource 설정을 넣으니, Resource Server 에서 다른 알고리즘으로 파싱이 안된다는 에러가 나더라구요.

@Bean
public JWKSource<SecurityContext> jwkSource() throws NoSuchAlgorithmException { 
  RSAKey rsaKey = generateRsa(); 
  JWKSet jwkSet = new JWKSet(rsaKey); 
  return (jwkSelector, context) -> jwkSele  ctor.select(jwkSet);
}

[DefaultJWTProcessor]

new BadJOSEException("Signed JWT rejected: Another algorithm expected, or no matching key(s) found");

 

Authorization server 에서 Token발행 과정을 디버깅하면

DelegatingOAuth2TokenGenerator > JwtGenerator

에서 alg : RS256, encoder 는 NimbusJwtEncoder 로 토큰이 저장됩니다.

 

Resource 서버에서 NimbusJwtDecoder 를 통해 진행되기는 하나 header key 가 RSA 로 들어오던데요.

 

Authorization server 의 jwkSource 설정을 모두 주석처리하니, 더 이상 키 불일치 에러는 발생하지 않더라구요.

 

버전 상의 문제일지 양쪽 서버에 뭔가 다른 설정이 필요했을지 궁금해서 문의 남깁니다.

 

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

인가서버에서 별도의 설정을 하지 않으면 일반적으로 RSA256 알고리즘으로 토큰이 발행됩니다.

그리고 Resource Server 는 spring.security.oauth2.resourceserver.jwt.jwk-set-uri 설정에 의해 인가서버로부터 JWKSet 정보를 가지고 와서 토큰을 검증하기 때문에 Resource Server 에서 NimbusJwtDecoder 의 알고리즘을 별도로 설정하지 않았다면 불일치 문제가 발생하지는 않습니다.
두 서버의 알고리즘 설정을 다시 확인해 보시기 바랍니다.

0

안녕하세요, 인프런 AI 인턴입니다.

leese님의 문제는 Authorization Server와 Resource Server 간의 JWT 토큰 처리에서 발생하는 알고리즘 불일치 문제로 보입니다.

말씀해주신 코드를 보면, Authorization Server에서 사용하는 JWKSource는 RSA 알고리즘을 사용하여 RSAKey를 생성하고 있습니다. 이때 RS256 알고리즘을 통해 Jwt가 인코딩되고 있는 것 같습니다. Authorization Server에서 발행한 JWT 토큰은 해당 서버의 jwkSource 설정에 따라 서명이 이루어집니다.

Resource Server에서는 NimbusJwtDecoder를 사용하여 JWT를 디코드하고 인증을 수행합니다. 이 과정 중 알고리즘 불일치 에러가 발생하는 경우, 두 가지 가능성을 확인해 볼 수 있습니다.

  1. Resource Server가 사용하는 JwtDecoder가 Authorization Server에서 사용된 알고리즘과 다른 알고리즘으로 디코드를 시도하고 있는 경우
  2. Resource Server에서 사용하는 JWKSet URI가 잘못 지정되었거나, 해당 URI를 통해 제공되는 JWKSet이 맞지 않는 경우

위의 설정들과 관련해서 spring.security.oauth2.resourceserver.jwt.jwk-set-uri 속성에 Authorization Server의 JWKSet URI를 정확히 지정했는지 확인하시고, Resource Server에서 해당 URI를 통해 정상적으로 JWKSet을 가져오고 있는지 확인해보셔야 합니다.

또한, spring.security.oauth2.resourceserver.jwt.jws-algorithms 속성을 통해 기대하는 알고리즘을 명시적으로 지정해보실 수도 있습니다.

문제의 원인 분석 및 해결을 위해 Spring Boot와 Spring Security의 버전을 확인하여 해당 버전에서 권장하는 설정 방법을 참고하는 것이 좋습니다.

추가적으로 질문하신 내용에 대한 자세한 참고자료를 아래 URL에서 확인하실 수 있습니다.

leese님의 프로필 이미지
leese

작성한 질문수

질문하기