구글이 해주는 내 로그인 기능
: Authentication(인증) + Authorization(인가)
- 로그인 시 보안
- 회원가입 시 이메일/전화번호 인증
- 비밀번호 찾기/변경
- 회원정보 변경
OAuth 로그인 구현 시 위의 기능을 구글이 대신 수행해주기 때문에 서비스 개발에 집중할 수 있다.
이렇게 생성된 것을 확인할 수 있다.
이제 클라이언트 Id와 클라이언트 보안 비밀 코드를 프로젝트에서 설정하면 된다.
src/main/resources/application-oauth.properties
생성 후 아래 코드 기입
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
클라이언트 Id와 클라이언트 보안 비밀 코드는 위 사진에서 OAuth 2.0 클라이언트 ID를 눌러보면 확인할 수 있다.
그리고 properties의 이름을 application-xxx.properties
로 지으면 xxx
라는 profile이 생성되어 이를 통해 관리할 수 있다.
application.properties
에 다음 코드를 추가해준다.
spring.profiles.include=oauth
그런데 클라이언트 Id와 클라이언트 보안 비밀 코드는 외부에 노출되면 안되는 정보이다. 그러므로 gitignore에 등록해주어야 한다.
application-oauth.properties
User.java
@Enumerated(EnumType.STRING)
: JPA로 DB에 저장할 때 Enum 값을 어떤 형태로 저장할 것인지 결정
기본적으로는 int로 된 숫자가 저장되는데 그렇게 되면 그 값이 무슨 코드를 의미하는지 알 수 없기 때문에 문자열로 지정해줌
UserRepository.java
findByEmail
: 소셜 로그인 반환값 중 email을 통해 이미 생성된 사용자인지 판별
User.java
Role.java
UserRepository.java
⚠️ "분명 코드가 똑같은데 왜 안 되지?" 할 때는 엉뚱한 걸 import 하진 않았는지 import 체크하기
build.gradle
에 다음 코드 추가
implementation('org.springframework.boot:spring-boot-starter-oauth2-client')
SecurityConfig.java
@EnableWebSecurity
: Spring Security 설정들을 활성화csrf().disable().headers().frameOptions().disable()
: h2-console 화면을 사용하기 위해 해당 옵션들을 disableauthorizeRequests
: URL 별 권한 관리를 설정하는 옵션의 시작점
이게 선언 되어야지만 antMatchers 옵션 사용 가능andMatchers
: 권한 관리 대상을 지정하는 옵션
URL, HTTP 메소드 별 관리 가능anyRequest
: 설정된 값 이외 나머니 URLlogout().logoutSuccessUrl("/")
: 로그아웃 성공시 이동할 주소oauth2Login
: OAuth2 로그인 기능 설정의 시작점userInfoEndpoint
: 로그인 성공 이후 사용자 정보를 가져올 때 설정들을 담당userService
: 소셜 로그인 성공 시 후속 조치를 진행할 서비스 인터페이스의 구현체를 등록
CustomOAuth2UserService.java
registraionId
: 현재 로그인 진행 중인 서비스를 구분하는 코드
(추후 다른 로그인 서비스가 추가되면 (Ex. 네이버, 구글, 카카오) 어떤 서비스인지 구분해야하기 때문userNameAttributeName
: OAuth2 로그인 진행 시 키가 되는 필드값
Primary Key와 같은 의미OAuthAttributes
: OAuth2UserService를 통해 가져온 OAuth2User의 attribute를 담을 클래스
(이후 다른 소셜 로그인에도 이 클래스를 사용할 것)SessionUser
: 세션에 사용자 정보를 저장하기 위한 Dto 클래스
➡️ 운영 및 유지보수를 위해 직렬화 기능을 가진 Dto를 따로 하나 생성하는 것이 좋다.
OAuthAttributes.java
of()
: OAuth2User에서 반환하는 사용자 정보는 Map이기 때문에 값 하나하나를 변환해야만 함toEntity()
: User 엔티티 생성
OAuthAttributes에서 엔티티를 생성하는 시점은 처음 가입할 때
SecurityConfig.java
CustomOAuth2UserService.java
OAuthAttributes.java
SessionUser.java
머스테치는 다른 언어와 같이 if문
을 제공하지 않는다.
true/false 여부만 판단하기 때문에 항상 최종값을 넘겨주어야 한다.
IndexController.java
(SessionUser) httpSession.getAttribute("user")
: 앞선 CustomOAuth2UserService에서 로그인 성공 시 세션이 SessionUser를 저장하도록 했음
→ 로그인 성공 시 httpSession.getAttribute("user")에서 값을 가져올 수 있음
서버를 키고 구글 로그인을 했을 때 H2-console을 확인해보면 이렇게 정보가 잘 나타나는 것을 확인할 수 있다.
그리고 지금은 GUEST의 권한을 가지고 있기 때문에 글 등록을 시도해도 정상적으로 처리되지 않는다.
그리고 H2-console에서 아래와 같이 권한을 변경해주고 다시 로그인 한 뒤 글이 정상적으로 잘 등록된다.
SELECT * FROM USER;
update user set role = 'USER';
index.mustache
IndexController.java
이 글은 이동욱님의 <스프링 부트와 AWS로 혼자 구현하는 웹 서비스> 를 보고 작성한 글입니다.