Spring Security 6 + OAuth2.0 로그인 기본 구성

정민교·2024년 9월 17일
0

spring security

목록 보기
13/13

📒OAuth2.0 로그인

리디렉션 URI

기본 리디렉션 URI 템플릿은 {baseUrl}/login/oauth2/code/{registrationId}이다.

여기서 registrationId는 ClientRegistration의 고유 식별자다.

리디렉션 URI는 Google 등에서 인증을 완료한 후 애플리케이션으로 돌아오는 경로이며, 이 경로는 사용자가 Google에서 로그인하고 승인할 권한(이메일, 프로필 정보 등)을 부여한 후, 애플리케이션이 Authorization Code를 받아 인증을 마무리한다.

여러 권한에 대해 사용자가 허용을 누르게 되면, OAuth 클라이언트가 사용자의 이메일 주소 및 기본 프로필 정보를 UserInfo 엔드포인트에서 가져와 인증된 세션을 설정한다.

application.yaml 작성

spring:
  security:
    oauth2:
      client:
        registration:	
          google:	
            client-id: google-client-id #대체
            client-secret: google-client-secret #대체

issuer-uri 속성

OpenID Connect 제공자(ex. google) 혹은 OAuth2 인증 서버는 설정 정보(ex. 인증 서버의 URL, 토큰 발급 URL 등)을 담고있는 메타데이터 엔드포인트를 제공한다.

애플리케이션에서 이 엔드포인트 URL을 issuer-uri에 설정하면 Spring Security가 자동으로 해당 메타데이터를 사용하여 ClientRegistration을 구성한다.

예시 (issuer-uri) 사용 X

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: google-client-id
            client-secret: google-client-secret
            authorization-grant-type: authorization_code
            scope: openid, profile, email
            redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
            authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
            token-uri: https://oauth2.googleapis.com/token
            user-info-uri: https://openidconnect.googleapis.com/v1/userinfo
            user-name-attribute: sub

예시 (issuer-uri) 사용 O

spring:
  security:
    oauth2:
      client:
        provider:
          google:
            issuer-uri: https://accounts.google.com  # 메타데이터 엔드포인트를 통해 나머지 URI가 자동 설정됨
        registration:
          google:
            client-id: google-client-id  # 수동 설정
            client-secret: google-client-secret  # 수동 설정
            scope: openid, profile, email  # 필요에 따라 수동 설정
            authorization-grant-type: authorization_code  # 수동 설정
            user-name-attribute: sub  # 수동 설정 (OpenID Connect에서는 보통 sub 사용)
  • issuer-uri:
    이 URI는 제공자의 메타데이터 엔드포인트를 가리킨다. 이 엔드포인트에서 authorization-uri, token-uri, userinfo-uri 같은 정보는 자동으로 설정된다.
  • client-id 및 client-secret:
    애플리케이션에 등록한 OAuth 클라이언트의 ID와 비밀번호는 수동으로 설정해야 합니다.
  • scope:
    openid는 OpenID Connect를 사용하기 위한 기본 스코프이고, 추가로 profile, email 등 필요에 따라 수동으로 설정할 수 있습니다.
  • authorization-grant-type:
    보통 authorization_code로 설정합니다.
    user-name-attribute: OpenID Connect의 경우 보통 sub(subject)이 사용자 고유 식별자로 사용됩니다.

CommonOAuth2Provider

CommonOAuth2Provider는 Google, GitHub, Facebook, Okta와 같이 잘 알려진 OAuth2 제공자에 대해 미리 정의된 기본 클라이언트 속성 기본값을 제공한다.

그래서 Google 클라이언트 구성은 client-id, client-secret 속성만 있어도 가능하다.

spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: google-client-id
            client-secret: google-client-secret

클라이언트 속성의 자동 기본값은 registrationId(google)가 CommonOAuth2Provider의 GOOGLE 열거형(대소문자 구분 없음)과 일치하기 때문이다.

spring:
  security:
    oauth2:
      client:
        registration:
          google-login:	
            provider: google	
            client-id: google-client-id
            client-secret: google-client-secret

registrationId를 google이 아닌 google-login으로 설정했더라도 provider 속성을 google로 설정하면 CommonOAuth2Provider.GOOGLE.getBuilder()에 설정된 클라이언트 속성 기본값 자동 적용을 활용하게 된다.

OAuth2Client 속성 기본값이 제공되는 OAuth2 제공자에 대해서는 issuer-uri 속성을 지정하지 않아도, 혹은 registrationId를 다르게 지정하더라도 provider 속성만 올바르게 지정하면 OAuth2Client 기본 속성값을 사용할 수 있다.

커스텀 프로바이더 속성 구성

일부 OAuth 2.0 프로바이더는 멀티 테넌시를 지원한다.

이는 테넌트(또는 서브 도메인)마다 서로 다른 프로토콜 엔드포인트를 사용하는 경우로,

예를 들어, Okta와 같은 OAuth 클라이언트는 특정 테넌트에 할당되며, 테넌트마다 다른 프로토콜 엔드포인트를 갖는다.

이런 경우 스프링 부트는 사용자 정의 프로바이더 속성을 구성할 수 있는 기본 속성을 제공한다: spring.security.oauth2.client.provider.[providerId]

spring:
  security:
    oauth2:
      client:
        registration:
          okta:
            client-id: okta-client-id
            client-secret: okta-client-secret
        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

기본 속성 (spring.security.oauth2.client.provider.okta)을 사용하면 프로토콜 엔드포인트의 위치를 사용자 정의하여 구성할 수 있다.

Spring Boot OAuth 클라이언트 자동 구성

Spring Boot의 OAuth 클라이언트 지원을 위한 자동 구성 클래스는 OAuth2ClientAutoConfiguration이다.

  • 구성된 OAuth 클라이언트 속성에서 ClientRegistration(들)로 구성된 ClientRegistrationRepository를 등록한다.
  • SecurityFilterChain 빈을 등록하고 httpSecurity.oauth2Login()을 통해 OAuth2 로그인을 활성화한다.

특정 요구 사항에 따라 자동 구성을 재정의해야 하는 경우, 다음과 같은 방법으로 가능하다.

  • ClientRegistrationRepository @Bean 등록
  • SecurityFilterChain @Bean 등록
  • 자동 구성을 완전히 재정의

SecurityFilterChain @Bean 등록을 동한 자동 구성 재정의

SecurityFilterChain을 @Bean으로 등록하고, @EnableWebSecurity와 함께 OAuth 2.0 로그인을 활성화 로직을 재구성할 수 있다.

@Configuration
@EnableWebSecurity
public class OAuth2LoginSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            )
            .oauth2Login(withDefaults());
        return http.build();
    }
}
profile
백엔드 개발자

0개의 댓글