Spring/Spring Security

[Spring Security] 6-2. OAuth2 Login: Core Configuration

noahkim_ 2025. 7. 15. 03:30
  • 유저가 oauth2 provider 또는 openid provider를 통해 애플리케이션에 로그인하도록 도와주는 기술
  • Spring Security는 공식적으로 Google과 Github을 지원합니다.

 

1. Spring Boot Sample (Google)

2. Spring Boot Property Mappings

  • OAuth2Client 자동설정을 제공
  • applicaion.yml ↔️ ClientRegistration 객체의 대응되는 속성으로 간단히 설정할 수 있음


표) applicaion.yml ↔️ ClientRegistration

더보기
Spring Boot ClientRegistration
spring.security.oauth2.client.registration.[registrationId] registrationId
spring.security.oauth2.client.registration.[registrationId].client-id clientId
spring.security.oauth2.client.registration.[registrationId].client-secret clientSecret
spring.security.oauth2.client.registration.[registrationId].client-authentication-method clientAuthenticationMethod
spring.security.oauth2.client.registration.[registrationId].authorization-grant-type authorizationGrantType
spring.security.oauth2.client.registration.[registrationId].redirect-uri redirectUri
spring.security.oauth2.client.registration.[registrationId].scope scopes
spring.security.oauth2.client.registration.[registrationId].client-name clientName
spring.security.oauth2.client.provider.[providerId].authorization-uri providerDetails.authorizationUri
spring.security.oauth2.client.provider.[providerId].token-uri providerDetails.tokenUri
spring.security.oauth2.client.provider.[providerId].jwk-set-uri providerDetails.jwkSetUri
spring.security.oauth2.client.provider.[providerId].issuer-uri providerDetails.issuerUri
spring.security.oauth2.client.provider.[providerId].user-info-uri providerDetails.userInfoEndpoint.uri
spring.security.oauth2.client.provider.[providerId].user-info-authentication-method providerDetails.userInfoEndpoint.authenticationMethod
spring.security.oauth2.client.provider.[providerId].user-name-attribute providerDetails.userInfoEndpoint.userNameAttributeName

 

OIDC Metadata

  • 인증 서버의 구성 정보 집합
  • 클라이언트가 인증 서버와 통신할 수 있도록 필요한 모든 정보를 담고 있음

 

표) OIDC Metadata

더보기
항목명 설명
issuer 인증 서버의 고유 식별자
authorization_endpoint 사용자 인증 요청을 보내는 URL
token_endpoint 클라이언트가 토큰을 받기 위한 URL
userinfo_endpoint Access Token으로 사용자 정보 요청하는 URL
jwks_uri 공개키를 제공하는 URL (ID Token 검증에 사용됨)
response_types_supported 지원하는 response type 목록 (예: code, id_token 등)
subject_types_supported 공개/비공개 사용자 식별 방식 (예: public, pairwise)
id_token_signing_alg_values_supported ID Token 서명에 사용하는 알고리즘 (예: RS256 등)

 

예) kakao

더보기

https://kauth.kakao.com/.well-known/openid-configuration

{
  "issuer": "https://kauth.kakao.com",
  "authorization_endpoint": "https://kauth.kakao.com/oauth/authorize",
  "token_endpoint": "https://kauth.kakao.com/oauth/token",
  "userinfo_endpoint": "https://kapi.kakao.com/v1/oidc/userinfo",
  "jwks_uri": "https://kauth.kakao.com/.well-known/jwks.json",
  "token_endpoint_auth_methods_supported": [
    "client_secret_post"
  ],
  "subject_types_supported": [
    "public"
  ],
  "id_token_signing_alg_values_supported": [
    "RS256"
  ],
  "request_uri_parameter_supported": false,
  "response_types_supported": [
    "code"
  ],
  "response_modes_supported": [
    "query"
  ],
  "grant_types_supported": [
    "authorization_code",
    "refresh_token"
  ],
  "code_challenge_methods_supported": [
    "S256"
  ],
  "claims_supported": [
    "iss",
    "aud",
    "sub",
    "auth_time",
    "exp",
    "iat",
    "nonce",
    "nickname",
    "picture",
    "email"
  ]
}

 

OpenID Connect Discovery
  • 클라이언트가 인증 서버의 정ㅂ조를 자동으로 가져올 수 있게 해주는 매커니즘
  • 정해진 표준 URL을 통해 각 OpenID Provider에 서버 정보를 요청할 수 있음
    • providerid.issue-uri만 설정하면, ClientRegistration 객체에 값을 자동으로 설정함

 

3. CommonOAuth2Provider

  • 자주 사용하는 OAuth2 Provider들의 설정을 미리 정의해둔 Enum 클래스
  • OIDC 메타데이터는 대부분 고정이므로 자동 설정이 가능함 (authorization url, token url, userinfo url 등)
  • provider 이름에 의해 enum 상수가 결정됨 (Github, Google, Facebook, Okta 등)

 

4. Configuring Custom Provider Properties

  • OAuth2Provider를 커스텀하는 방법
  • 테넌트별로 각기 다른 OAuth2 엔드포인트가 다를 경우 사용
  • 기본 제공되는 CustomOAuth2Provider 사용 불가

 

설정) Okta

더보기

클라이언트별로 endpoint가 다름

  • https://your-company.okta.com/oauth2/v1/authorize
  • https://your-company.okta.com/oauth2/v1/token
spring:
  security:
    oauth2:
      client:
        registration:
          okta: # 등록 ID
            client-id: okta-client-id
            client-secret: okta-client-secret
            provider: okta # 아래 provider 설정을 이 registration에 연결
        provider:
          okta:
            authorization-uri: https://your-subdomain.oktapreview.com/oauth2/v1/authorize
            token-uri: https://your-subdomain.oktapreview.com/oauth2/v1/token
            user-info-uri: https://your-subdomain.oktapreview.com/oauth2/v1/userinfo
            user-name-attribute: sub
            jwk-set-uri: https://your-subdomain.oktapreview.com/oauth2/v1/keys
  • OpenID 메타데이터를 사용하지 않고 직접 설정해주기

 

5. Overriding Spring Boot Auto-configuration

  • Spring Boot는 자동으로 OAuth2 Client를 설정해줌

 

설정) OAuth2ClientAutoConfiguration

더보기
@AutoConfiguration(before = SecurityAutoConfiguration.class)
@ConditionalOnClass({ EnableWebSecurity.class, ClientRegistration.class })
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@Import({ OAuth2ClientRegistrationRepositoryConfiguration.class, OAuth2WebSecurityConfiguration.class })
public class OAuth2ClientAutoConfiguration {

}

 

항목 설명
✅ ClientRegistrationRepository 자동 생성
application.yml에 설정한 OAuth2 클라이언트 정보 기반
(InMemoryClientRegistrationRepository)
✅ SecurityFilterChain 자동 생성
http.oauth2Login()이 포함된 SecurityFilterChain 생성
✅ 기본 로그인 흐름 자동 구성
provider 기반 OAuth2 Login 활성화 (Google, GitHub 등)

 

Register a ClientRegistrationRepository @Bean

  • OAuth2Client의 설정 정보를 담고 있는 저장소 인터페이스
  • OAuth2Login을 하거나, Access Token을 요청하려면 ClientRegistration 객체 정보를 알아야 함

 

설정) 커스터마이징

더보기
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
    return new InMemoryClientRegistrationRepository(this.googleClientRegistration());
}
  • 직접 Java 코드로 OAuth2 클라이언트 등록

 

 

출처