스프링 부트와 AWS로 혼자 구현하는 웹 서비스 를 공부하고 정리한 내용입니다.
스프링 시큐리티 : 막강한 인증과 인가(or 권한 부여) 기능을 가진 프레임워크
- 스프링 기반의 애플리케이션에서는 보안을 위한 표준이다.
- 인터셉터, 필터 기반의 보안 기능을 구현하는 것보다 스프링 시큐리티를 통해 구현하는 것을 더욱 권장한다.
- Mvc, Data, Batch 등 처럼 확장성을 고려한 프레임워크다 보니 다양한 요구사항을 손쉽게 추가하고 변경할 수 있다.
이번 장에서는 스프링 시큐리티와 OAuth 2.0을 구현한 구글 로그인을 연동하여 로그인 기능을 만들어 보겠다.
최근들어, 로그인할 때 id와 password 입력하는 방식보다는 구글, 페이스북, 네이버 로그인과 같은 소셜 로그인 기능을 사용한다.
🔔 왜? 소셜 로그인을 사용할까?
직접 구현할 경우
- 로그인시 보안
- 회원가입시 이메일 혹은 전화번호 인증
- 비밀번호 찾기
- 비밀번호 변경
- 회원정보 변경
을 전부 직접 구현해야한다.
OAuth 로그인 구현 시 위 목록은 구글, 페이스북, 네이버 등에 맡기면 된다. 그래서 서비스 개발에 집중할 수 있다.
💡 참고
스프링 부트 2 방식의 자료를 찾으려면?
spring-security-oauth2-autoconfigure
라이브러리를 썼는지 확인한다.application.properties
혹은application.yml
정보가이와 같이 설정했는지 확인해야한다.
client 인증 정보만 입력하면 된다.
CommonOAuth2Provider
라는 enum이 추가되어 구글, 깃허브, 페이스북, 옥타의 기본 설정은 여기서 제공한다.
다만, 이외 소셜 로그인(네이버, 카카오 등)을 추가한다면 직접 다 추가해줘야 한다.
email/profile/openid
이다. 이외 다른 정보들을 사용하고 싶다면 범위 추가 버튼으로 추가하면 된다.
✔️ 승인된 리디렉션 URI
{도메인}/login/oauth2/code/{소셜서비스코드}
로 리다이렉트 URL을 지원한다.localhost
외에 추가로 주소를 추가해야한다.
생성을 완료하면 클라이언트 ID
, 클라이언트 보안 비밀 코드
를 확인할 수 있다.
✏️ yml vs properties
properties
- Spring boot 애플리케이션 프로젝트에서 resource 디렉토리 하위에 자동으로 생성되는 파일이다.
.properties
파일의 포맷은 name=value 형식이다.yml
- properties 파일과 달리 계층 구조 형식으로 값을 지정할 수 있고, prefix의 중복 제거가 가능하다.
.yml
파일을 사용하기 위해서는 SnakeYAML 라이브러리가 포함되어야 하고, 일반적으로 spring-boot-starter의 의존성은 기본적으로 제공해준다.
yml을 사용해보자!
application-oauth.yml
scope=profile,email
scope
의 기본값은 openid, profile, email
이다.openid
라는 scope가 있으면 Open Id Provider
로 인식하게 되는데, 이렇게 되면 OpenId Provider인 서비스
(구글)와 그렇지 않은 서비스
(네이버/카카오 등)로 나눠서 각각 OAuth2Service로 만들어야 한다.openid scope
를 빼고 등록한 것이다.properties
의 이름을 application-xxx.properties
로 만들면 xxx
라는 이름의 profile
이 생성되어 이를 통해 관리할 수 있다.profile=xxx
라는 식으로 호출하면 해당 properties의 설정들을 가져올 수 있게 된다.
application.yml
에 application-oauth.yml
를 포함하도록 코드 추가
클라이언트 ID와 클라이언트 보안 비밀은 외부에 노출되면 안되기에 github repository에 올라가는 것을 막아야 한다. 이러할 때, .gitignore
에 파일이름을 추가한다.
.gitignore
에 생성한 application-oauth.yml
을 추가한다.
application-oauth.yml
추가 후, 리포지토리를 확인해보니 해당 파일이 보이지 않는다.
💡 참고
만약에.gitignore
가 작동하지 않는다면?
gitignore 관련 참고 사이트 를 참고한다.