Back-End/Springboot와 AWS로 혼자 구현하는 웹 서비스

Chapter 05. 스프링 시큐리티와 OAuth 2.0으로 로그인 기능 구현하기 (1)

yeonx 2022. 3. 25. 00:46
728x90

스프링 시큐리티란?

막강한 인증과 인가(혹은 권한 부여) 기능을 가진 프레임워크

사실상 스프링 기반의 애플리케이션에서는 보안을 위한 표준

 

인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 권장

 

이번 장에서는 스프링 시큐리티와 OAuth 2.0을 구현한 구글 로그인을 연동하여 로그인 기능을 만들어 보겠다!

 

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

많은 서비스에서 로그인 기능을 id/password 방식보다는 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다.

그 이유는 직접 구현할 경우 배보다 배꼽이 커지는 경우가 많기 때문이다. 직접 구현하면 다음을 전부 구현해야 한다. 

  • 로그인 시 보안
  • 회원가입 시 이메일 혹은 전화번호 인증
  • 비밀번호 찾기
  • 비밀번호 변경
  • 회원정보 변경

OAuth 로그인 구현 시 앞선 목록의 것들을 모두 구글, 페이스북, 네이버에 맡기면 되니 서비스 개발에 집중할 수 있다.

 

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

스프링 부트 1.5에서의 OAuth2 연동 방법이 2.0에서는 크게 변경되었다. 하지만, 설정 방법이 크게 차이가 없는 경우를 많이 볼 수 있다. -> 이는 spring-security-oauth2-autoconfigure 라이브러리 덕분이다

spring-security-oauth2-autoconfigure

이를 사용할 경우 스프링부트 2에서도 1.5에서 쓰던 설정을 그대로 사용할 수 있다. 새로운 방법을 쓰기보다는 기존에 안전하게 작동하던 코드를 사용하는 것이 아무래도 더 확실하므로 많은 개발자가 이 방식을 사용했다.

하지만 이 책에서는 스프링부트 2 방식인 Spring Security Oauth2 Client 라이브러리를 사용해서 진행한다. 그 이유는 다음과 같다

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

스프링 부트 1.5방식에서는 url 주소를 모두 명시해야 하지만, 2.0 방식에서는 client 인증 정보만 입력하면 된다. 1.5 버전에서 직접 입력했던 값들은 2.0버전으로 오면서 모두 enum으로 대체되었다.

CommonOAuth2Provider라는 enum이 새롭게 추가되어 구글, 깃허브, 페이스북, 옥타의 기본 설정값은 모두 여기서 제공한다.

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;
        }
    },
    ...
}

이 외에 다른 소셜 로그인(네이버, 카카오 등)을 추가한다면 직접 다 추가해 주어야 한다. 이 점을 기억해 해당 블로그에서 어떤 방식을 사용하는 지 확인 후 참고하면 된다.

 

 

출처 : 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 [이동욱 지음]