Spring Security ‐ OAuth 2.0 Resource Server - dnwls16071/Backend_Summary GitHub Wiki

📚 OAuth 2.0 Resource Server

  • OAuth 2.0 인가 프레임워크 역할 중 클라이언트 및 인가서버와의 통신을 담당하는 리소스 서버의 기능을 필터 기반으로 구현한 모듈이다.
  • 간단한 설정만으로 클라이언트의 리소스 접근 제한, 토큰 검증을 위한 인가 서버와의 통신 등의 구현이 가능하다.
  • 애플리케이션이 권한 관리를 별도 인가 서버에 위임하는 경우에 사용할 수 있으며 리소스 서버는 요청을 인가할 때 인가 서버에 물어볼 수 있다.

OAuth2ResourceServer

  • 클라이언트의 접근을 제한하는 인가 정책을 설정한다.
  • 인가 서버에서 발급한 Access Token의 유효성을 검증하고 접근 범위에 따른 적절한 자원을 전달하도록 설정한다.

JWT

  • 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을 가지고 자체 검증 후 인증 과정을 거치도록 한다.