Jwt Client Assertion Validation 커스터마이징
IT IT 인터넷 Spring Security
http://java21.net/blog/marco?post_id=2433
Jwt Client Assertion Validation 커스터마이징
Jwt Client Assertion Validation 커스터마이징
기본 동작
Spring Authorization Server에서는 JwtClientAssertionDecoderFactory.DEFAULT_JWT_VALIDATOR_FACTORY를 통해 기본적인 OAuth2TokenValidator<Jwt>를 제공한다.
이를 통해 RegisteredClient 기준으로 다음과 같은 JWT Claim 들을 검증한다.
기본 Claim 검증 항목
iss (issuer, 발급자)
sub (subject, 사용자 식별자)
aud (audience, 대상)
exp (만료 시간)
nbf (not before, 활성화 시간)
JwtClientAssertionDecoderFactory 커스터마이징 이유
기본 Claim 검증 외에 추가적인 Claim 검증이 필요한 경우 사용
예를 들어, JWT 안에 존재하는 커스텀 Claim 값 검증 등
비즈니스 요구사항에 따른 Claim 검증 로직 변경 필요 시 활용
구조 및 동작 방식
구성 요소 | 역할 |
|---|---|
JwtClientAssertionDecoderFactory | RegisteredClient에 따라 JwtDecoder를 생성 |
JwtClientAssertionAuthenticationProvider | 위 Factory를 사용해 JWT Bearer 기반 Client 인증 처리 |
사용 예시
Custom Claim Validator 추가 예시
JwtClientAssertionDecoderFactory decoderFactory = new JwtClientAssertionDecoderFactory();
decoderFactory.setJwtValidatorFactory(registeredClient -> {
OAuth2TokenValidator<Jwt> defaultValidator =
JwtClientAssertionDecoderFactory.DEFAULT_JWT_VALIDATOR_FACTORY.apply(registeredClient);
OAuth2TokenValidator<Jwt> customValidator = new DelegatingOAuth2TokenValidator<>(
defaultValidator,
new CustomClaimValidator() // 직접 구현한 Claim 검증 로직
);
return customValidator;
});
JwtClientAssertionAuthenticationProvider provider =
new JwtClientAssertionAuthenticationProvider(registeredClientRepository);
provider.setJwtDecoderFactory(decoderFactory);CustomClaimValidator 예시
public class CustomClaimValidator implements OAuth2TokenValidator<Jwt> {
@Override
public OAuth2TokenValidatorResult validate(Jwt jwt) {
if (!jwt.containsClaim("custom-claim")) {
OAuth2Error error = new OAuth2Error("invalid_token", "Missing custom-claim", null);
return OAuth2TokenValidatorResult.failure(error);
}
return OAuth2TokenValidatorResult.success();
}
}정리
사용 목적 | 설명 |
|---|---|
기본 검증 | iss, sub, aud, exp, nbf Claim 자동 검증 |
커스터마이징 검증 | CustomClaimValidator 로 추가 Claim 검증 |
확장 방식 | JwtClientAssertionDecoderFactory의 setJwtValidatorFactory() 이용 |