[Spring] 스프링 시큐리티 - Oauth2 클라이언트

Jin·2023년 9월 5일
0

Spring

목록 보기
6/9
post-thumbnail

1. 스프링 시큐리티란?

막강한 인증(Authentication)과 인가(Authorization) 기능을 가진 프레임워크로, 스프링 기반의 애플리케이션 보안을 위한 표준이라고 보면 된다. 따라서 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것이 적극적으로 권장된다.

스프링의 대부분 프로젝트들(MVC, Data, Batch 등)처럼 확장성을 고려한 프레임워크다 보니 다양한 요구사항을 손쉽게 추가하고 변경할 수 있다. 이런 손쉬운 설정은 특히 스프링 부트 1.5에서 2.0으로 넘어오면서 더욱 강력해졌다.

2. 스프링 시큐리티 Oauth2 클라이언트

Oauth2 클라이언트란?
스프링 부트 프레임워크에서 OAuth 2.0 프로토콜을 사용하여 인증을 수행하는 클라이언트이다.
즉, OAuth 2.0 프로토콜을 사용하여 인증하는 클라이언트를 구현하는데 필요한 기능을 제공한다. 이를 통해 서비스 제공자의 API를 사용하고 인증된 사용자 정보를 가져올 수 있다. (참고1, 참고2)

많은 서비스에서는 로그인 기능을 ID/Password 방식보다는 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다. 그 이유는 로그인을 직접 구현하면 아래의 목록을 직접 구현해야 한다. (OAuth를 사용해도 구현해야 하는 것 제외) 즉, 배보다 배꼽이 커지는 경우가 많다.

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

따라서 OAuth 로그인을 구현하면 위의 목록을 모두 구글, 페이스북, 네이버 등에 맡기면 되므로 서비스 개발에 더욱 집중할 수 있다.

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

스프링 부트 1.5에서의 OAuth2 연동 방법이 2.0에서는 크게 변경되었다. 하지만 인터넷 자료들을 보면 설정 방법에 크게 차이가 없는 경우를 자주 볼 수 있다. 이는 spring-security-oauth2-autoconfigure 라이브러리 덕분이다. spring-security-oauth2-autoconfigure 라이브러리를 사용하면 스프링 부트 2.0에서도 1.5에서 쓰던 설정을 그대로 사용할 수 있다. 새로운 방법을 쓰기보다는 기존에 안전하게 작동하던 코드를 사용하는 것이 비교적 확실하므로, 많은 개발자가 이 방식을 사용해왔다.

하지만 지금은 스프링 부트 2.0 방식인 Spring Security Oauth2 Client 라이브러리를 사용해서 진행할 것이다. 그 이유는 아래와 같다.

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

또한 스프링 부트 1.5 방식에서는 url 주소를 모두 명시해야 하지만, 2.0 방식에서는 client 인증 정보만 입력하면 된다. 1.5 방식에서 직접 입력했던 값들은 2.0 버전으로 오면서 모두 enum으로 대체되었다. CommonOAuth2Provider라는 enum이 새롭게 추가되어 구글, 깃허브, 페이스북, 옥타(Okta)의 기본 설정값은 모두 여기서 제공한다. 그 이외의 다른 소셜 로그인(네이버, 카카오 등)을 추가한다면 직접 다 추가해 주어야 한다.

public enum CommonOAuth2Provider {

	GOOGLE {

		@Override
		public Builder getBuilder(String registrationId) {
			ClientRegistration.Builder builder = getBuilder(registrationId,
					ClientAuthenticationMethod.CLIENT_SECRET_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.issuerUri("https://accounts.google.com");
			builder.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo");
			builder.userNameAttributeName(IdTokenClaimNames.SUB);
			builder.clientName("Google");
			return builder;
		}

	},
    ...
}

참고: 스프링 부트 2 방식의 자료를 찾고 싶은 경우
spring-security-oauth2-autoconfigure 라이브러리를 사용했는지 확인하고, application.properties 또는 application.yml 정보가 아래와 같이 차이가 있는지 비교해야 한다.

스프링 부트 1.5

google:
  client:
    clientId: [클라이언트 ID]
    clientSecret: [클라이언트 Secret]
    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: [클라이언트 ID]
        clientSecret: [클라이언트 Secret]

참고 도서
스프링 부트와 AWS로 혼자 구현하는 웹 서비스

profile
https://guswls28.tistory.com 💨💨

0개의 댓글