05장 스프링 시큐리티와 OAuth2.0으로 로그인 기능 구현하기


스프링 시큐리티는 막강한 인증과인가기능을 가진 프레임워크입니다. 사실상 스프링 기반의 애플리케이션에서는 보안을 위한 표준이라고 보면 됩니다. 05장에서는 스프링 시큐리티와 OAuth2.0을 구현한 구글 로그인을 연동하여 로그인 기능을 만들어 보겠습니다.

 

 

5.1 스프링 시큐리티와 스프링 시큐리티 Oauth2 클라이언트 


  • 스프링 부트 1.5 vs 스프링 부트 2.0

스프링 부트 1.5에서의 OAtuh2 연동 방법이 2.0에서는 크게 변경되었습니다. 하지만, 인터넷 자료들을 보면 설정방법에 크게 차이가 없는 경우를 자주 봅니다. 이는 아래 라이브러리 덕분입니다.

spring-security-oauth2-autoconfigure

spring-security-oauth2-autoconfigure 라이브러리를 사용할 경우 스프링부트 2에서도 1.5에서 쓰던 설정을 그래도 사용할 수 있습니다. 새로운 방식을 쓰기보다는 기존에 안전하게 작동하던 코드를 사용하는 것이 아무래도 더 확실하므로 많은 개발자가 이방식을 사용해 왔습니다. 하지만 이 책에서는 스프링 부트2 방식인 Spring Security Oauth2 Client 라이브 러리를 사용해 진행합니다. 이유는 다음과 같습니다.

  • 스프링 팀에서 기존 1.5에서 사용되던 Spring-security-oauth 프로젝트는 유지상태로 결정했으며 더는 신규 기능을 추가하지 않고 버그 수정 정도의 기능만 추가될 예정, 신규 기능은 새 oauth2 라이브러리에서만 지우너하겠다고 선언
  • 스프링 부트용 라이브러리 출시
  • 기존에 사용되던 방식은 확장 포인트가 적정하게 오픈되어 있지 않아 직접 상속하거나 오버라이딩 해야 하고 신규 라이브러리의 경우 확장 포인트를 고려해서 설계된 상태

그리고 한가지 더 이야기 하자면, 이책 이외에 스프링 부트2 방식의 자료를 찾고 싶은 경우 인터넥 자료들 사이에서 다음 두가지만 확인하면 됩니다. 

먼저 spring-security-oauth2-autoconfigure 라이브러리를 써는지 확인하고 application.properties 혹은 application.yml정보가 다음 과 같이 차이가 있는지 비교해야합니다.

// 스프링 부
google :
  client : 인증정보
    clientSecret: 인증정보
    accessTokenUri: https://accounts.google.com/o/oauth2/token
    userAuthorizationUri: https://accounts.google.com/o/oauth2/auth
    clientAuthenticationScheme: form
    scope: email, profile
  resource:
    userInfoUri: https://www.googleapis/com/oauth2/v2/userinfo
// 스프링 부트 2.0
spring
  security:
    oauth2:
     client:
       clientId: 인증정보
       clientSecret: 인증정보

2.0 방식에서는 client 인증 정보만 입력하면 됩니다. 1.5버전에서 직접 입력했던 값들은 2.0버전으로 오면서 모두 enum으로 대체되었습니다. (CommonOAuth2Procider)

public enum CommonOAuth2Provider {

    GOOGLE {

        @Override
        public Builder getBuilder(String registrationId) {
            ClientRegistration.Builder builder = getBuilder(registrationId,
                    ClientAuthenticationMethod.BASIC, DEFAULT_REDIRECT_URL);
            builder.scope("openid", "profile", "email");
            builder.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth");
            builder.tokenUri("https://www.googleapis.com/oauth2/v4/token");
            builder.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs");
            builder.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo");
            builder.userNameAttributeName(IdTokenClaimNames.SUB);
            builder.clientName("Google");
            return builder;
        }
    },
    ...

 

복사했습니다!