• 스프링 시큐리티 개념
  • SpringBoot 1.5와 2.0의 차이
  • 구글 서비스 등록

스프링 시큐리티(Spring Security)

  • 인증(Authentication)와 인가(Authorization) 기능을 가진 프레임워크
  • 스프링 기반의 어플리케이션에서는 보안을 위한 표준
  • 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 권장

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

  • 직접 구현하는 경우 개발해야할 기능
    • 로그인 시 보안
    • 비밀번호 찾기
    • 비밀번호 변경
    • 회원가입 시 이메일 혹은 전화번호 인증
    • 회원정보 변경
  • OAuth 로그인 구현 시 위 목록들을 모두 구글, 페이스북, 네이버 등에 맡겨 서비스 개발에 집중

Spring Boot 2.0의 OAuth 2.0 설정 방법

  • OAuth2 설정

    • spring-security-oauth2-autoconfigure 라이브러리는 Spring Boot2에서도 1.5에서 쓰던 설정을 사용할 수 있다.
      • 기존에 사용되던 방식은 확장 포인트가 적절하게 오픈되어있지 않아 직접 상속하거나 오버라이딩 해야 하고, 신규 라이브러리의 경우 확장 포인트를 고려해서 설계된 상태
    • 여기서는 Spring Security Oauth2 Client 라이브러리 사용
      • 기존 1.5 에서 사용되던 spring-security-oauth 프로젝트는 신규 기능 없이 유지
      • 신규 기능은 새 oauth2 라이브러리에서만 지원
  • 스프링 부트용 라이브러리(starter) 출시

  • 스프링 부트2.0 security 설정 정보 확인 방법

    • spring-security-oauth2-autoconfigure 라이브러리 확인
    • application.properties 혹은 application.yaml 정보에 차이 비교

SpringBoot 1.5 버전 설정

google:  
  client:  
    clientId: 인증정보  
    clientSecret: 인증정보  
    accessTokenUrl: {url}  
    userAuthorizationUrl: {url}  
    clientAuthenticationScheme: form  
    scope: email, profile  
  resource:  
    userInfoUrl: {url}

SpringBoot 2.x 버전 설정

spring:  
  security:  
    oauth2:  
      client:  
        clientId: 인증정보  
        clientSecret: 인증정보

버전 차이

  • SpringBoot 1.5 vs 2.x
    • 1.5 방식에서는 url 주소를 모두 명시해야 하지만, 2.0 방식에서는 client 인증 정보만 입력하면 된다.
    • 1.5 버전에서 직접 입력했던 값들은 2.0버전으로 오면서 모두 emum으로 대체 되었다.
    • CommonOAuth2Provider에서 구글, 깃허브, 페이스북, 옥타(Okta)의 기본 설정 값을 제공한다.
    • 이외 다른 소셜 로그인(naver, kakao)을 추가한다면 직접 다 추가 해야 한다.
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;
        }
    },
    // ... 
}

구글 서비스 등록

  • 구글 서비스 신규 서비스 생성
    • 발급된 인증 정보(clientId, clientSecret)을 통해 로그인 기능과 소셜 서비스 기능을 사용

Google Cloud Platform

  • 프로젝트 선택

구글 클라우드 플랫폼

  • 새 프로젝트

새 프로젝트

  • 프로젝트 서비스 명 입력

등록될 서비스의 이름 입력

  • API 및 서비스 카테고리 -> 사용자 인증 정보

API 및 서비스 -> 사용자 인증 정보

  • 사용자 인증 정보 만들기 -> OAuth 클라이언트 ID

OAuth 클라이언트 ID

  • 다시 OAuth 클라이언트 ID 만들기 페이지로 이동

동의 화면 구성

  • Type 선택 (외부 선택 밖에 안됨)

  • 어플리케이션 이름 작성, Google API 범위 확인
    • 어플리케이션 이름
      • 구글 로그인 시 사용자에게 노출될 어플리케이션 이름
    • 지원 이메일
      • 사용자 동의 화면에서 노출될 이메일 주소
    • Google API의 범위
      • 구글 서비스에서 사용할 범위 목록
      • 기본값은 email, profile, openId (다른 정보 사용시 추가 가능)

동의 화면 구성

  • OAuth 클라이언트 ID 페이지 이동

  • OAuth 클라이언트 ID 만들기 페이지 이동
    • 어플리케이션 유형 선택
    • 프젝트명 입력
    • [승인된 리다이렉션 URL] 추가
      • 스프링 부트 시큐리티에서 기본적으로 {domain}/login/oauth2/code/{소셜서비스코드}로 리다이렉트
      • 현재 소셜서비스코드는 'google'
      • 서비스에서 파라미터로 인증 정보를 주었을 때, 인증이 성공하면 구글에서 리다이렉트할 URL
      • 시큐리티에서 구현되어 있기 때문에, 사용자가 별도로 리다이렉트 URL을 지원하는 Controller를 만들 필요가 없다.
      • AWS 서버에 배포할 경우 localhost 외에 주소를 추가해야 한다.
      • 현재는 로컬에서 개발하기 때문에 http://localhost:8085/login/oauth2/code/google 등록

  • 완료 후 클라이언트 ID, 클라이언트 Secret 확인
    • 해당 값들을 프로젝트에 설정해야 한다.

  • OAuth 2.0 클라이언트 ID 생성 확인

  • 생성된 클라이언트 ID 접근 해보면 서비스에 클라이언트 ID, 클라이언트 Secret 생성된 것을 확인 가능

  • 프로젝트에 OAuth 설정 적용
    • resources 디렉토리에 application-oauth.properties 파일 생성

  • application-oauth.properties 파일 내에 구글 OAuth 설정
    • 클라이언트 ID 값 설정
    • 클라이언트 보안 값 설정
    • scope는 profile, email을 강제 설정
      • 기본값은 openId, profile, email 이다.
      • 하지만 openId를 그대로 설정하는 경우 Open Id Provider로 인식하게 된다.
      • 그리할 경우 OpenId Provider인 서비스(구글)와 그렇지 않은 서비스(Naver, Kakao 등) 나눠서 OAuth2Service를 만들어야 한다.
      • 하나의 OAuth2Sercice를 사용하기 위해 openId scope를 제외한다.
spring.security.oauth2.client.registration.google.client-id={clientId}
spring.security.oauth2.client.registration.google.client-secret={clientSecret}
spring.security.oauth2.client.registration.google.scope=profile,email
  • application.properties 파일에서 application-oauth.properties를 포함하도록 구성

    • 스프링 부트에서는 properties의 이름을 application-xxx.properteis로 만들면 xxx라는 이름의 profile이 생성되어 이를 통해 관리할 수 있다.
    • 즉, profile=xxx라는 식으로 호출하면 해당 properties의 설정들을 가져올 수 있다.
    • 여기선 스프링 부트의 기본 설정파일인 application.properties, application-oauth.properties를 포함하도록 구성한다.
  • application.properties 파일 내 설정 추가

spring.profiles.include=oauth

'Spring > SpringBoot' 카테고리의 다른 글

[SpringBoot] 로그인 & 포스팅 권한 테스트  (0) 2020.05.31
[SpringBoot] OAuth2 Google Login  (0) 2020.05.31
[SpringBoot] 게시글 삭제  (0) 2020.05.29
[SpringBoot] 게시글 수정  (0) 2020.05.29
[SpringBoot] 게시글 전체 조회  (0) 2020.05.29

+ Recent posts