Nimbus JOSE+JWT Library :
。OAuth2.0 Resource Server dependency를 추가할 경우 자동으로 같이 추가됨.
。Java에서 JWT, JWK , JWE( JSON Web Encryption ) , JWS ( JSON Web Signature )를 쉽게 다룰 수 있도록 지원하는 오픈소스 Library.
▶ JWT의 검증 , Encryption & Decryption , Public Key 관리 등의 기능을 제공하는 도구.
。Spring Security는 기본적으로 Nimbus Library를 활용하여 JWT를 Decrypt.
HTTPSecurity객체.oauth2ResourceServer(람다식)
。OAuth2.0 Resorce Server를 이용하여 HTTP Request의 Authentication Header에 포함된 Access Token ( ex. JWT, Opaque Token 등 )을 전달받아 JWT Decoder의 Instance에 의해 Decryption을 수행 및 유효성 검증을 수행하여 Authentication하는 Method.
▶ 검증을 수행한 후 Authentication된 HTTP Request에 대해서만 API에 접근할 수 있도록 처리.
。HttpSecurity객체.oauth2ResourceServer(람다식)의 람다식 매개변수는 OAuth2ResourceServerConfigurer 객체를 매개변수로 전달.
▶ 해당 Instance에서 .jwt() , .opaqueToken()을 설정하여 Resource Server의 Access Token 검증방식 선택.
。JwtDecoder Interface의 구현체의 Instance를 생성하는 @Bean Method를 정의하여 Encrypt된 JWT Token을 Decrypt 후 유효성을 검증하는 역할을 수행
▶ JWT를 Decryption 및 검증하는 용도로 활용되므로, JWK URI에서 Key를 가져와서 Decrypt를 수행하는 JwtDecoder Instance를 생성하여 반환.
@Configuration
public class JwtSecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http.oauth2ResourceServer(oauth2 -> oauth2
.jwt(jwt -> jwt
.decoder(jwtDecoder())
))
.build();
}
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withJwkSetUri("https://auth-server-url/.well-known/jwks.json").build();
}
}
OAuth2ResourceServerConfigurer
。Spring Security에서 OAuth2.0 Resource Server의 Configuration을 수행하는 용도로 사용.
▶ OAuth2.0 Access Token을 검증하는 보안필터를 설정.
。HTTPSecurity객체.oauth2ResourceServer(람다식)의 람다식 매개변수로서 OAuth2ResourceServerConfigurer Instance가 전달
▶ 해당 Instance에서 .jwt() , .opaqueToken()을 설정하여 Resource Server의 Access Token 인증방식 선택
OAuth2ResourceServerConfigurer객체.jwt(람다식)
。OAuth2.0 Resource Server에서 JWT 기반 Authentication을 수행하는 Method.
▶ Resource Server가 JWT Token을 검증하도록 설정.
。일반적으로 Resource Server에 의해 HTTP Request의 JWT를 Custom JWT Decoder를 통해 Decrypt 하여 검증하는 용도로 사용.
。람다식 매개변수는 JwtConfigurer객체를 받는다.
▶ JwtConfigurer.decoder(JwtDecoder구현체Instance)를 통해 JWT Decoder 설정
JwtConfigurer
。JWT 기반 Authentication Configuration을 수행.
▶ 주로 JWT Token을 Decryption하는 용도로 사용됨.
。OAuth2ResourceServerConfigurer.jwt(람다식)의 람다식 매개변수로 JwtConfigurer instance가 전달됨.
JwtConfigurer객체.decoder(JwtDecoder구현체Instance)
。JWT의 Decryption을 수행하는 JWT Decoder를 설정.
JwtDecoder
。RSA를 통해 Encrypt된 JWT Token을 Decrypt 및 유효성을 검증하는 역할을 수행하는 Interface
▶ NimbusJwtDecoder등의 구현 Class의 instance를 생성하여 JwtDecoder의 instance로 반환하는 Custom JWT Decoder @Bean Method를 정의하여 OAuth2ResourceServerConfigurer객체.jwt(람다식)에 활용.
。RSA를 통해 Encrypt된 JWT Token을 Decrypt 시 Public Key가 필요하므로, JWK URI 에서 Key를 가져와서 Decrypt를 수행.
▶ JWT Signature의 검증을 수행하기 위해서 Public Key가 필요하므로 JWK를 활용한다.
@Bean
public JwtDecoder jwtDecoder() {
return NimbusJwtDecoder.withJwkSetUri("https://auth-server-url/.well-known/jwks.json").build();
}
NimbusJwtDecoder :
。Spring Security에서 제공하는 JWT Decoder로서 JWT를 Decrypt 및 유효성 검증을 수행하며 JwtDecoder Interface를 구현한 기본 Class
▶ JWK URI, RSA Public Key 등을 통해 JWT의 Signature를 검증.
NimbusJwtDecoder.withJwkSetUri("JWK URI")
。RSA 암호화 알고리즘을 사용하는 JWT를 Decrypt 및 Signature의 유효성 검증 시 사용하는 NimbustJwtDecoder의 instance를 생성하는 static Method.
▶ JWK Set을 제공하는 Authentication Server가 정의된 JWK Set URI를 정의하여 자동으로 Public Key를 가져온 후 Decrypt 및 JWT Signature의 유효성 검증을 수행하는 JwtDecoder Instance를 생성
。JWK Set URI : JWK Set을 제공하는 URI
https://example.com/oauth2/jwks : OAuth 2.0 Authentication Server가 제공하는 공개 키 목록.
NimbusJwtDecoder.withPublicKey(RSAPublicKey객체) :
。RSA 암호화 알고리즘을 사용하는 JWT의 Decrypt 및 Signature의 유효성 검증을 수행하는 NimbusJwtDecoder instance를 특정 RSAPublicKey instance를 활용하여 생성하는 Method.
▶ Client가 JWT를 Server에 전송 시 Server는 해당 Public Key 기반으로 생성된 NimbusJwtDecoder instance를 통해 전송된 JWT Signature를 유효성 검증 가능.
NimbusJwtDecoder.build() :
。NimbusJwtDecoder의 instance를 생성하는 builder method
▶ NimbusJwtDecoder는 JwtDecoder의 구현 Class이므로 해당 Interface의 instance로서 활용 가능.