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

LeeKyoungChang·2022년 5월 18일
0
post-thumbnail

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 를 공부하고 정리한 내용입니다.

 

스프링 시큐리티 : 막강한 인증과 인가(or 권한 부여) 기능을 가진 프레임워크

  • 스프링 기반의 애플리케이션에서는 보안을 위한 표준이다.
  • 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 더욱 권장한다.
  • Mvc, Data, Batch 등 처럼 확장성을 고려한 프레임워크다 보니 다양한 요구사항을 손쉽게 추가하고 변경할 수 있다.

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

 

📚 1. 스프링 시큐리티와 스프링 시큐리티 Oauth2 클라이언트

최근들어, 로그인할 때 id와 password 입력하는 방식보다는 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다.

 

🔔 왜? 소셜 로그인을 사용할까?
직접 구현할 경우

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

을 전부 직접 구현해야한다.
OAuth 로그인 구현 시 위 목록은 구글, 페이스북, 네이버 등에 맡기면 된다. 그래서 서비스 개발에 집중할 수 있다.

 

💡 참고
스프링 부트 2 방식의 자료를 찾으려면?

  • spring-security-oauth2-autoconfigure 라이브러리를 썼는지 확인한다.
  • application.properties 혹은 application.yml 정보가

인증정보

이와 같이 설정했는지 확인해야한다.
client 인증 정보만 입력하면 된다.
CommonOAuth2Provider라는 enum이 추가되어 구글, 깃허브, 페이스북, 옥타의 기본 설정은 여기서 제공한다.
다만, 이외 소셜 로그인(네이버, 카카오 등)을 추가한다면 직접 다 추가해줘야 한다.

 

📚 2. 구글 서비스 등록

구글 클라우드 플랫폼

📖 A. 프로젝트 생성

스크린샷 2022-05-19 오후 4 05 14

 

📖 B. OAuth 동의 화면 - 사용자 인증 정보 만들기

스크린샷 2022-05-19 오후 4 06 16

 

스크린샷 2022-05-19 오후 4 06 39 스크린샷 2022-05-19 오후 4 07 04
  • 앱 이름(애플리케이션 이름) : 구글 로그인 시 사용자에게 노출될 애플리케이션 이름을 이야기한다.
  • 지원 이메일 : 사용자 동의 화면에서 노출될 이메일 주소, 보통은 서비스의 help 이메일 주소를 사용하지만, 여기서는 개인 이메일 주소를 사용하면 된다.

 

스크린샷 2022-05-19 오후 4 07 31 스크린샷 2022-05-19 오후 4 07 52
  • Google API의 범위 : 이번에 등록할 구글 서비스에서 사용할 범위 목록, 기본 값은 email/profile/openid이다. 이외 다른 정보들을 사용하고 싶다면 범위 추가 버튼으로 추가하면 된다.

 

스크린샷 2022-05-19 오후 4 08 14 스크린샷 2022-05-19 오후 4 08 58 스크린샷 2022-05-19 오후 4 09 07
  • 자신의 이메일을 입력한다.

 

📖 C. OAuth 클라이언트 ID 만들기

스크린샷 2022-05-19 오후 4 11 12 스크린샷 2022-05-19 오후 4 14 28

✔️ 승인된 리디렉션 URI

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

 

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

 

📚 3. Project에 application-oauth 등록

✏️ yml vs properties
properties

  • Spring boot 애플리케이션 프로젝트에서 resource 디렉토리 하위에 자동으로 생성되는 파일이다.
  • .properties 파일의 포맷은 name=value 형식이다.

yml

  • properties 파일과 달리 계층 구조 형식으로 값을 지정할 수 있고, prefix의 중복 제거가 가능하다.
  • .yml 파일을 사용하기 위해서는 SnakeYAML 라이브러리가 포함되어야 하고, 일반적으로 spring-boot-starter의 의존성은 기본적으로 제공해준다.

yml을 사용해보자!

 

application-oauth.yml

스크린샷 2022-05-19 오후 4 29 00
  • 클라이언트 ID, 클라이언트 보안 비밀 코드 추가
  • scope=profile,email
    • scope의 기본값은 openid, profile, email이다.
    • openid라는 scope가 있으면 Open Id Provider로 인식하게 되는데, 이렇게 되면 OpenId Provider인 서비스(구글)와 그렇지 않은 서비스(네이버/카카오 등)로 나눠서 각각 OAuth2Service로 만들어야 한다.
    • 하나의 OAuth2Service로 사용하기 위해 일부러 openid scope를 빼고 등록한 것이다.
  • 스프링에서는 properties의 이름을 application-xxx.properties로 만들면 xxx라는 이름의 profile이 생성되어 이를 통해 관리할 수 있다.
    • profile=xxx라는 식으로 호출하면 해당 properties의 설정들을 가져올 수 있게 된다.

 

스크린샷 2022-05-19 오후 4 29 43
  • application.ymlapplication-oauth.yml를 포함하도록 코드 추가

 

클라이언트 ID와 클라이언트 보안 비밀은 외부에 노출되면 안되기에 github repository에 올라가는 것을 막아야 한다. 이러할 때, .gitignore에 파일이름을 추가한다.

스크린샷 2022-05-19 오후 4 32 44
  • .gitignore에 생성한 application-oauth.yml을 추가한다.

 

application-oauth.yml 추가 후, 리포지토리를 확인해보니 해당 파일이 보이지 않는다.

스크린샷 2022-05-19 오후 4 40 52

 

💡 참고
만약에 .gitignore가 작동하지 않는다면?
gitignore 관련 참고 사이트 를 참고한다.

 

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글