※ 이번 포스트는 <스프링부트와 AWS로 혼자 구현하는 웹서비스> 책의 5장을 공부하면서 정리한 것입니다. 소스코드는 책을 참고해주세요
Springboot 1.5 vs Springboot2.0
OAuth2 연동 방법이 1.5에서 2.0으로 넘어오면서 크게 변경되었으나 spring-security-oauth2-autoconfigure 라이브러리를 사용하면 1.5의 설정방식을 그대로 적용할 수 있다. 하지만 아래와 같은 이유로 Springboot 2.0 방식인 Spring Security Oauth2 Client 라이브러리를 사용하는 것이 좋다.
- 스프링 팀에서 기존 1.5에서 사용되던 spring-security-oauth 프로젝트는 유지 상태로 결정했으며 더 이상 신규 기능을 추가하지 않고 버그 수정 정도만 진행하는 것으로 결정했다. 신규 기능은 새 Oauth2 라이브러리에서만 지원된다.
- 스프링부트용 라이브러리가 출시 됐다.
- 기존에 사용하던 방식은 확장 포인트가 적절하게 오픈되어 있지 않아 직접 상속하거나 오버라이딩해야 하고 신규 라이브러리의 경우 확장 포인트를 고려해서 설계된 상태이다.
● Springboot 1.5와 2.0의 차이
Springboot 1.5 방식에서는 url 주소를 모두 명시해야 하지만 이것들이 enum으로 대체되면서 2.0에서는 client 인증 정보만 입력하면 된다.
(CommonOAuth2Provider 라는 enum이 추가되어 구글, 깃허브, 페이스북, 옥타의 기본 설정값을 모두 제공한다. 앞서 나온 사이트 이외에 다른 사이트의 소셜 로그인을 추가해주고 싶다면 그땐 직접 추가해주어야 한다.)
구글 로그인 GCP 설정하기
● 구글 서비스 등록하기
1. Google Cloud Platform(GCP)에서 '새 프로젝트'를 생성한다
2. 생성한 프로젝트로 이동 후 '사용자 인증 정보' →'사용자 인증 정보 만들기' → 'OAuth 클라이언트 ID'를 선택한다
3. '동의화면 구성'에서 아래와 같은 항목을 설정해준다
- 애플리케이션 이름: 구글 로그인 시 사용자에게 노출될 애플리케이션 이름
- 지원 이메일: 사용자 동의 화면에서 노출될 이메일 주소
- Google API 범위: 등록할 구글 서비스에서 사용할 범위 목록. 기본값은 email/profile/openid이다
4. 'OAuth 클라이언트 ID 만들기'에서 프로젝트 이름을 등록하고 URL 주소를 등록한다. 여기서 '승인된 리디렉션 URI'란 서비스에서 파라미터로 인증 정보를 주었을 때 인증이 성공하면 구글에서 리다이렉트할 URL을 의미한다. Springboot2의 시큐리티에서는 기본적으로 {도메인}/login/oauth2/code/{소셜서비스코드} 로 리다이렉트 URL을 지원하고 있으며, 별도로 리다이렉트를 지원하는 Controller를 만들 필요가 없다.
5. 생성된 클라이언트 정보에서 확인할 수 있는 클라이언트 ID와 클라이언트 비밀 코드를 src/main/resources/application-oauth.properties 파일에 등록한다. 이때 아래와 같은 코드를 추가해준다.
scope=profile, email
scope를 설정하지 않으면 기본값인 openid, profile, email로 설정되는데, openid의 경우 Open Id Provider로 인식되기 때문이다. 그렇게되면 OpenId Provider인 서비스(구글)와 그렇지 않은 서비스(ex. 네이버, 카카오 등)로 나눠서 각각 OAuth2Service를 만들어야 한다.
6. application.properties에 다음 코드를 추가한다.
spring.profiles.include=oauth
이는 스프링부트의 기본 설정 파일인 application.properties에서 application-oauth.properties 를 포함하도록 하기 위함이다.
7. User 클래스를 생성하고 Spring Security를 설정한다.
네이버 로그인 설정
1. developers.naver.com에서 애플리케이션을 등록한다.
2. 등록 후 발급된 ClientID, Client Secret 값을 application-oauth.properties에 수동으로 입력해어야 한다.
3. OAuthAttributes에 네이버인지 판단하는 코드와 네이버 생성자를 추가해준다.
코드 개선하기
● 어노테이션 기반으로 코드 개선하기
같은 코드가 반복되면 유지 보수성이 떨어진다. 때문에 적절한 어노테이션을 생성하여 로그인을 구현하는 과정에서 세션값을 가져오는 부분과 같이 코드가 반복되는 부분은 어노테이션으로 바꿔주는 것이 좋다
● 세션저장소 설정
기본적으로는 세션이 내장 톰캣의 메모리에 저장된다. 때문에 애플리케이션 실행 시 세션이 실행되는 구조에선 항상 초기화가 되고, 애플리케이션을 재실행하면 로그인이 풀린다. 또한 2대 이상의 서버를 사용하는 경우 톰캣마다 세션 동기화 설정을 해주어야 한다는 점도 문제이다.
때문에 아래의 세 가지 방법 중 하나를 선택하여 사용하는 것이 좋다.
- 톰캣 세션 사용
: 일반적으로 별다른 설정을 하지 않을 때 선택하는 방법이고, 2대 이상의 WAS가 구동되는 환경에서는 톰캣 간의 세션 공유를 위한 설정을 추가적으로 해주어야 한다
- MySQL과 같은 데이터베이스를 세션 저장소로 사용
: 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법. 많은 설정이 필요치 않으나 로그인 요청 마다 DB IO가 발생하여 성능 이슈가 발생할 수 있다. 때문에 로그인 요청이 많이 없는 환경에서 사용하는 것이 바람직하다
- Redis, Nemcached와 같은 메모리 DB를 세션 저장소로 사용
: B2C 서비스에서 가장 많이 사용되는 방식. 실제 서비스로 사용하기 위해선 Embedded Redis와 같은 방식이 아닌 외부 메모리 서버가 필요하다
'SpringBoot' 카테고리의 다른 글
Mustache로 화면 구성하기 (0) | 2023.02.04 |
---|---|
Springboot에서 DB다루기(with JPA) (0) | 2023.02.04 |