방법1) spring-security-oauth2-autoconfigure 라이브러리 사용
기존 스프링부트 1.5에서 쓰던 설정 그대로 사용가능하다는 장점이 있음
방법2) Spring Security Oauth2 Client 라이브러리 사용(스프링부트 2 방식)
❓ 방법1의 장점에도 방법2를 선택하는 이유
- 스프링 팀에서 기존 1.5에서 사용되던 spring-security-oauth 프로젝트는 유지 상태로 결정하여, 신규 기능은 새 oauth2 라이브러리에서만 지원하겠다고 선언
- 스프링 부트용 라이브러리 출시(starter)
- 기존에 사용되던 방식은 확장 포인트가 적절하게 오픈되어 있지 않아 직접 상속하거나 오버라이딩 해야 하고 신규 라이브러리의 경우 확장 포인트를 고려해서 설계된 상태
+) 스프링부트 1.5 vs 스프링부트 2.0
발급된 인증 정보(clientId와 clientSecret)를 통해서 로그인 기능과 소셜 서비스 기능 사용
: https://console.cloud.google.com/
1. 새프로젝트 생성 후 API 및 서비스 > 사용자 인증 정보 > OAuth 클라이언트 ID로 사용자 인증 정보 만들기
- 애플리케이션 이름: 구글 로그인 시 사용자에게 노출될 애플리케이션 이름(freelec-springboot2-web으로 설정해둠)
- 지원 이메일: 사용자 동의 화면에서 노출될 이메일 주소. 보통 서비스의 help 이메일 주소를 사용하지만, 개인 이메일을 사용할 것
- Google API의 범위: 이번에 등록할 구글 서비스에서 사용할 범위 목록. 기본값은 email/profile/openid이며, 기본범위만 사용할 것.
2. 사용자 인증 정보 > OAuth 클라이언트 ID 만들기 화면 > 애플리케이션 유형/프로젝트 이름/승인된 리디렉션 URI 등록
+) 승인된 리디렉션 URI
- 서비스에서 파라미터로 인증 정보를 주었을 때 인증이 성공하면 구글에서 리다이렉트할 URL
- 스프링부트2 버전의 시큐리티에서는 기본적으로 {도메인}/login/oauth2/code/{소셜서비스코드}로 리다이렉트 URL을 지원함
- 사용자가 별도로 리다이렉트 URL을 지원하는 Controller를 만들 필요가 없음
-> 시큐리티에서 이미 구현해 놓은 상태- 현재는 개발단계이므로 http://localhost:8080/login/oauth2/code/google만 등록
- 이후 AWS 서버에 배포하게 되면 localhost 외에 추가로 주소를 추가해야 함
3. 생성된 클라이언트 정보
1. application-oauth 등록
spring.security.oauth2.client.registration.google.client-id=클라이언트 ID
spring.security.oauth2.client.registration.google.client-secret=클라이언트 보안 비밀
spring.security.oauth2.client.registration.google.scope=profile,email
✔ scope=profile,email
- 기본값이 openid,profile,email이기 때문에 많은 예제에서는 scope를 별도로 등록하지 않음
- 위 코드에서는 강제로 profile, scope를 등록한 이유는 openid라는 scope가 있으면 OpenId Provider로 인식하여 OpenId Provider인 서비스(구글)와 그렇지 않은 서비스(네이버/카카오 등)로 나눠서 각각 OAuth2Service를 만들어야 함
- 하나의 OAuth2Service로 사용하기 위해 일부러 openid scope를 빼고 등록함
spring.profiles.include=oauth
- 스프링부트에서는 properties의 이름을 application-xxx.properties로 만들면 xxx라는 이름의 profile이 생성되어 이를 통해 관리할 수 있음
- 즉, profile=xxx라는 식으로 호출하면 해당 properties의 설정들을 가져올 수 있음
- 호출하는 방식에는 여러 방식이 있으나, 여기서는 스프링부트의 기본 설정 파일인 application.properties에서 application-oauth.properties를 포함하도록 구성함
2. .gitignore 등록
구글 로그인을 위한 클라이언트 ID(clientId)와 클라이언트 보안 비밀은 보안이 중요한 정보이기 때문에 깃허브에 올라가지 않도록 하기 위해 다음 코드 추가
application-oauth.properties