Spring Security ‐ OAuth 2.0 Resource Server - dnwls16071/Backend_Summary GitHub Wiki
- OAuth 2.0 인가 프레임워크 역할 중 클라이언트 및 인가서버와의 통신을 담당하는 리소스 서버의 기능을 필터 기반으로 구현한 모듈이다.
- 간단한 설정만으로 클라이언트의 리소스 접근 제한, 토큰 검증을 위한 인가 서버와의 통신 등의 구현이 가능하다.
- 애플리케이션이 권한 관리를 별도 인가 서버에 위임하는 경우에 사용할 수 있으며 리소스 서버는 요청을 인가할 때 인가 서버에 물어볼 수 있다.
OAuth2ResourceServer
- 클라이언트의 접근을 제한하는 인가 정책을 설정한다.
- 인가 서버에서 발급한 Access Token의 유효성을 검증하고 접근 범위에 따른 적절한 자원을 전달하도록 설정한다.
- JWT로 전달하는 토큰을 검증하기 위한 JwtDecoder, BearerTokenAuthenticationFilter, JwtAuthenticationProvider 등의 클래스 모델들을 제공한다.
- 자체 검증 프로세스를 지원한다.
Opaque
- 인가 서버의 introspection 엔드 포인트로 검증할 수 있는 Opaque 토큰을 지원한다.
- 실시간으로 토큰 활성화 여부를 확인할 수 있다.
jwkSetUri : 인가 서버에서 서명한 토큰의 위치를 나타낸다.
issuerUri : 인가 서버의 위치를 나타낸다.
publicKeyLocation : 공개키를 가지고 있는 파일의 위치를 나타낸다.
jwsAlgorithm : JWT 토큰을 서명하기 위한 알고리즘을 나타낸다.
introspectionUri : 토큰을 검증하기 위한 Introspection 엔드 포인트를 나타낸다.
📚 OAuth 2.0 Resource Server application.yml 설정 및 OAuth2ResourceServerProperties
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:8080/realms/oauth2 # 서비스 공급자 위치
jwk-set-uri: http://localhost:8080/realms/oauth2/protocol/openid-connect/certs # OAuth 2.0 JwkSetUri 엔드 포인트
jws-algorithms: RSA256 # OAuth 2.0 JWS 서명 알고리즘
audiences: http://localhost:8081 # 수신자 위치
public-key-location: classpath:certs/publicKey.txt # OAuth 2.0 JWS 검증을 위한 PublicKey 파일 위치
issuer-uri : http://localhost:8080는 인가 서버가 발급할 JWT 토큰의 iss 클레임에 추가되는 값으로서 발급자를 나타낸다.
jwk-set-uri : http://localhost:8080/oauth2/jwks는 인가 서버가 발급한 JWT 토큰으 공개키 정보를 검색할 수 있는 엔드포인트를 나타낸다.
- 리소스 서버는 자체 검증 설정에도 이 속성을 사용하며 이 속성으로 인가 서버 공개키를 찾고 건네 받은 JWT의 유효성을 검사하게 된다.
인가 서버 메타데이터 엔드포인트
issuer-uri 프로퍼티를 사용하면 인가 서버가 지원하는 엔드포인트는 반드시 셋 중 하나여야 한다.
https://localhost:8080/.well-known/oauth-authorization-server/issuer
https://localhost:8080/issuer/.well-known/openid-configuration
https://localhost:8080/.well-known/openid-configuration/issuer
📚 AuthenticationEntryPoint
- AuthenticationEntryPoint is used to send an HTTP response that requests credentials from a client.
- Sometimes, a client proactively includes credentials (such as a username and password) to request a resource. In these cases, Spring Security does not need to provide an HTTP response that requests credentials from the client, since they are already included.
- In other cases, a client makes an unauthenticated request to a resource that they are not authorized to access. In this case, an implementation of AuthenticationEntryPoint is used to request credentials from the client. The AuthenticationEntryPoint implementation might perform a redirect to a log in page, respond with an WWW-Authenticate header, or take other action.
📚 자동 설정에 의한 초기화 과정
@EnableWebSecurity
public class ResourceServerConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) -> requests.anyRequest().authenticated()); // 모든 요청에 대해 인증을 받아야 리소스 접근이 가능하다.
http.formLogin().permitAll() // 사용자가 폼 로그인을 통해 인증하게 되면 리소스 접근이 가능하다.
return http.build();
}
}
- 사용자가 폼 로그인을 통해 인증과정 없이 리소스 접근이 가능하도록 할려면 요청 시 Access Token을 가지고 자체 검증 후 인증 과정을 거치도록 한다.