[Spring&AWS][5-1] 스프링 시큐리티와 OAuth2.0으로 로그인 기능 구현하기

kiteB·2022년 3월 18일
0

Spring-AWS

목록 보기
7/13
post-thumbnail

이 글은 책 「스프링 부트와 AWS로 혼자 구현하는 웹 서비스」를 공부하고 정리한 글입니다.

오늘은 스프링 시큐티리와 OAuth2.0을 구현한 구글 로그인을 연동해보겠다.


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

0. 스프링 시큐리티(Spring Security)란?

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

  • 사실상 스프링 기반의 애플리케이션에서 보안 표준이다.
  • 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 적극적으로 권장하고 있다.

🔗 Spring Security에 대한 더 자세한 설명은 Spring Security Docs 확인


1. 소셜 로그인을 사용하는 이유

소셜 로그인을 사용하지 않고 직접 구현하는 경우 (OAuth를 사용하더라도) 다음 기능을 전부 구현해야 하기 때문이다.

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

OAuth 로그인 구현 시 위의 기능들을 모두 구글, 페이스북, 네이버 등에 맡기면 되므로 서비스 개발에 집중할 수 있게 된다.


2. 스프링 부트 2.0 방식인 Spring Security Oauth2 Client 라이브러리를 사용하는 이유

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

[ 구글 서비스 등록 ]

🔗 구글 클라우드 플랫폼에 접속

1. 프로젝트 생성


2. 사용자 인증 정보 만들기

2-1. OAuth 동의 화면

  • 앱 이름: 구글 로그인 시 사용자에게 노출될 애플리케이션 이름
  • 사용자 지원 이메일: 사용자 동의 화면에서 노출될 이메일 주소. 보통은 서비스의 help 이메일 주소 사용

2-2. 범위

2-3. 테스트 사용자

생성 완료!

3. OAuth 클라이언트 ID 만들기

✅ 승인된 리디렉션 URI

  • 서비스에서 파라미터로 인증 정보를 줬을 때 인증이 성공하면 구글에서 리다이렉트할 URL
  • 스프링 부트 2 버전의 시큐리티에서는 기본적으로 {도메인}/login/oauth2/code/{소셜서비스코드}로 리다이렉트 URL을 지원한다.
  • 사용자가 따로 리다이렉트 URL을 지원하는 컨트롤러를 만들 필요가 없다.
    → 스프링 시큐티리가 이미 구현했다.
  • 현재는 개발 단계이므로 하나만 등록했지만, AWS 서버에 배포하게 되면 localhost 외에 추가로 주소를 추가해야 한다.

생성을 완료하면 다음과 같은 창이 떠서 클라이언트 ID, 클라이언트 보안 비밀 코드를 확인할 수 있다.


4. application-oauth 등록

✅ application-oauth.properties

src/main/resources 경로에 application-oauth.properties 파일을 추가해서 클라이언트 ID와 클라이언트 보안 비밀 코드를 추가해주자.

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
    • scope의 기본값은 openid, profile, email이다.
    • openid라는 scope가 있으면 Open Id Provider로 인식하게 되는데, 이렇게 되면 OpenId Provider인 서비스(구글)와 그렇지 않은 서비스(네이버/카카오 등)로 나눠서 각각 OAuth2Service로 만들어야 한다.
    • 하나의 OAuth2Service로 사용하기 위해 일부러 openid를 빼고 등록한 것이다.
  • 스프링에서는 properties의 이름을 application-xxx.properties로 만들면 xxx라는 이름의 profile이 생성되어 이를 통해 관리할 수 있다.
    • profile=xxx라는 식으로 호출하면 해당 properties의 설정들을 가져올 수 있게 된다.

✅ application.properties

application-oauth.properties를 포함하도록 다음 코드를 추가하자.

spring.profiles.include=oauth

✅ .gitignore

🚫 클라이언트 ID와 클라이언트 보안 비밀은 외부에 노출되면 안된다!

만약 프로젝트 코드를 github에 올린다면, .gitignore에 다음 코드를 추가해서 application-oauth.properties 파일이 올라가는 것을 막아야 한다.

application-oauth.properties

다음 시간에는 구글 로그인을 프로젝트에 적용하도록 하겠다.

profile
🚧 https://coji.tistory.com/ 🏠

0개의 댓글