🌱JAVA/Spring

[Spring Boot] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 09

뉴발자 2023. 1. 18.
728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

OAuth2.0

 

 

스프링 시큐리티 (Spring Security)

막강한 인증(Authentication)과 인가(Authorization) 기능을 가진 Framework이다.

 

스프링 기반의 애플리케이션에서 보안을 위한 표준이다.

 

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

 

 

스프링의 대부분 프로젝트들(Mvc, Data, Batch 등)처럼

 

확장성을 고려한 프레임워크다 보니 다양한 요구사항을 손쉽게 추가하고 변경할 수 있다.

 

이런 손쉬운 설정은 특히나 스프링 부트 1.5에서 2.0으로 넘어가면서 더욱 강력해졌다.

 

 

 

 

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

많은 서비스에서 로그인 기능을 id/password 방식보다는

 

구글, 카카오, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다.

 

이 책의 저자는 그 이유를 배보다 배꼽이 커지는 경우가 많기때문이라고 생각한다.

 

직접 로그인 기능을 구현한다면 아래와 같은 기능들을 전부 구현해야할 것이다.

 

(단, OAuth를 써도 구현해야 하는 것은 제외)

 


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

 

OAuth 로그인 구현 시 앞선 목록의 것들을 모두 구글, 카카오, 네이버 등에 맡기면 되니

 

다른 서비스 개발에 집중할 수 있게 된다.

 

 

 

 

Spring Boot 1.5 vs Spring Boot 2.0

Spring 1.5에서의 OAuth2 연동 방법이 2.0에서는 크게 변경되었다.

 

하지만, 인터넷 자료들(블로그, 깃허브 등)을 보면 설정 방법에 크게 차이가 없는 경우를 자주 보게 된다.

 

이는 spring-security-oauth2-autoconfigure 라이브러리 덕분이다.

 

spring-security-oauth2-autoconfigure

 

이 라이브러리를 사용할 경우,

 

Spring Boot 2.0에서도 1.5에서 쓰던 설정을 그대로 사용할 수 있다.

 

 

새로운 방법을 쓰기보단 기존에 안전하게 작동하던 코드를 사용하는 것이

 

아무래도 더 확실하므로 많은 개발자들이 이 방식을 사용해왔다.

 

 

하지만 이 책에서는 Spring Boot 2.0 방식인

 

Spring Security Oauth2 Client 라이브러리를 사용해서 진행한다.

 

이유는 아래와 같다.

 


Spring 팀에서 기존 1.5에 사용되던 spring-security-oauth 프로젝트는 유지 상태로 결정했으며,

 

더는 신규 기능은 추가하지 않고 버그 수정 정도의 기능만 추가될 예정,

 

신규 기능은 oauth2 라이브러리에서만 지원하겠다고 선언했다.

 

 

Spring Boot용 라이브러리(starter)의 출시

기존에 사용되던 방식은 확장 포인트가 적절하게 오픈되어 있지 않아서

 

직접 상속하거나 오버라이딩 해야하고,

 

신규 라이브러리의 경우 확장 포인트를 고려해서 설계된 상태이다.

 

 

이 책 이외에 스프링 부트 2 방식의 자료를 찾고 싶은 경우 인터넷 자료들 사이에서 아래 두 가지만 확인하면 된다.

  1. spring-security-oauth2-autoconfigure 라이브러리를 사용했는지 확인
  2. application.properties 혹은 application.yml 정보가 아래와 같이 차이가 있는지 비교

 

Spring Boot 1.5

google:
	client:
    		clientId: 인증정보
        	clientSecret: 인증정보
        	accessTokenUrl: https://accounts.google.com/o/oauth2/token
        	userAuthorizationUrl: https://accounts.google.com/o/oauth2/auth
        	clientAuthenticationScheme: form
        	scope: email, profile
    	resource:
    		userInfoUri: https://www.googleapis.com/oauth2/v2/userinfo

 

 

Spring Boot 2.x

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

 

Spring Boot 1.5 방식에서는 url 주소를 모두 명시해야 하지만,

 

2.0 방식에서는 client 인증 정보만 입력하면 된다.

 

1.5 버전에서 직접 입력했던 값들은 2.0버전으로 오면서 모두 enum으로 대체됐다.

 

CommonOAuth2Provider라는 enum이 새롭게 추가되어

 

구글, 깃허브, 페이스북, 옥타의 기본 설정값은 모두 여기서 제공한다.

 

 

CommonOAuth2Provider

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://accounts.google.com/oauth2/v4/token");
            		builder.tokenUri("https://accounts.google.com/oauth2/v3/certs");
            		builder.userInfoUri("https://accounts.google.com/oauth2/v3/userinfo");
            		builder.userNameAttributeName(IdTokenClaimNames.SUB);
            		builder.clientName("Google");
                
            		return builder;
            
        	}
    	},
    
    	...
    
}

 

이외에 다른 소셜 로그인(네이버, 카카오 등)을 추가한다면 직접 추가해줘야 한다.

 

이 점을 기억해 해당 블로그에서 어떤 방식을 사용하는지 확인 후 참고하면 된다.

 

 

 

 

구글 서비스 등록

1. 신규 서비스 생성

먼저 구글 서비스에서 신규 서비스를 생성한다.

 

여기서 발급된 인증 정보(clientId와 clientSecret)를 통해서 로그인 기능과

 

소셜 서비스 기능을 사용할 수 있으니 무조건 발급받고 시작해야 한다.

 

구글 클라우드 플랫폼 주소로 이동한다.

 

 

구글 클라우드 플랫폼 주소

https://console.cloud.google.com

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

 

 

리고 아래의 사진과 같이 [프로젝트 선택] 탭을 클릭한다.

 

 

구글 서비스 - 프로젝트 선택

 

프로젝트 선택을 클릭하면 아래와 같이 프로젝트 목록이 나온다.

 

[새 프로젝트] 버튼을 클릭해서 신규 프로젝트를 생성해준다.

 

구글 서비스 - 새 프로젝트

 

창이 뜨면 등록될 서비스의 이름을 입력하고 위치는 조직 없음(기본) 설정으로 놔두면 된다.

 

필자는 교재를 따라 freelec-springboot2-webservice로 지었으나 원하는 이름으로 편하게 지어도 된다.

 

구글 서비스 - 프로젝트명 설정

 

[프로젝트 선택] 탭을 클릭해서 생성된 프로젝트를 선택해준다

 

구글 서비스 - 프로젝트 선택

 

왼쪽 메뉴 탭을 클릭해서 [API 및 서비스] 카테고리의 [사용자 인증 정보]를 클릭한다.

 

구글 서비스 - 사용자 인증 정보

 

아래와 같은 화면이 나오고 [사용자 인증 정보 만들기] 탭을 클릭하고 [OAuth 클라이언트 ID]를 선택해준다.

 

구글 서비스 - 사용자 인증 정보 만들기

 

[동의 화면 구성]을 클릭하면 아래와 같이 User Type을 선택하는 화면이 나오고

 

[외부]를 선택해주고 [만들기]를 클릭하면 된다.

 

구글 서비스 - OAuth 동의 화면

 

항목에 *이 써져있는 항목 [앱 이름, 사용자 지원 이메일, 개발자 연락처 정보] 부분을 작성해 주고

 

[저장 후 계속] 버튼을 클릭한다.

 

구글 서비스 - 앱 정보 입력

 

구글 서비스 - OAuth 동의 화면 설정

 


애플리케이션 이

  • 구글 로그인 시 사용자에게 노출될 애플리케이션 이름을 지정한다.

 

 

사용자 지원 이메일

  • 사용자 동의 화면에서 노출될 이메일 주소이다.
  • 보통은 서비스의 help 이메일 주소를 사용하지만, 여기서는 본인의 이메일 주소를 사용하면 된다.

 

범위 화면에 [범위 추가 또는 삭제] 버튼을 클릭하면 아래와 같은 화면이 나오고

 

[email, profile,openid] 항목을 추가해준다.

 

구글 서비스 - 범위 설정

 

구글 서비스 - 범위 설정

 


Google API 범위

이번에 등록할 구글 서비스에서 사용할 범위 목록이다.

 

기본값은 email, profile, openid이며, 여기서는 딱 기본 범위만을 사용한다.

 

이외 다른 정보들도 사용하고 싶다면 체크해서 추가해주면 된다.


 

테스트 사용자 설정 화면은 별다른 설정 없이 [저장 후 계속] 버튼을 눌러 넘겨준다.

 

다시 왼쪽 메뉴의 [사용자 인증 정보] 탭을 클릭하고

 

[사용자 인증 정보 만들기] 탭의 [OAuth 클라이언트 ID] 탭을 클릭한다.

 

구글 서비스 - 사용자 인증 정보 생성

 

처음 선택했을 때와는 다른 화면이 나오고 [애플리케이션 유형]을 선택하는 창이 나온다.

 

[웹 애플리케이션]을 선택하면 창이 확장되는데 아래와 같이 입력하고 [만들기] 버튼을 클릭한다.

 

구글 서비스 - OAuth 클라이언트 ID 만들기

 

구글 서비스 - OAuth 클라이언트 ID 만들기

 


승인된 리디렉션 URI

서비스에서 파라미터로 인증 정보를 주었을 때

 

인증이 성공하면 구글에서 리다이렉트할 URL 주소이다.

 

 

Spring Boot 2 버전의 시큐리티에서는 기본적으로

 

{도메인}/login/oauth2/code/{소셜서비스코드}로 리다이렉트 URL을 지원하고 있다.

 

 

사용자가 별도로 리다이렉트 URL을 지원하는 Controller를 만들 필요가 없다.

 

시큐리티에서 이미 구현해 놓은 상태이다.

 

 

현재는 개발 단계이므로 http://localhost:8080/login/oauth2/code/google로만 등록한다.

 

AWS 서버에 배포하게 되면 localhost 외에 추가로 주소를 추가해야 한다.


 

[만들기] 버튼을 클릭하면 아래와 같이 생성된 클라이언트 ID와 보안 비밀번호가 표시되고

 

OAuth 2.0 클라이언트 ID 목록에 추가된다.

 

구글 서비스 - OAuth 2.0 클라이언트 ID 생성

 

 

 

다음번에는 Client ID와 보안 코드를 프로젝트에 설정하고 소셜 로그인을 구현하는 방법을 포스팅하겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

댓글