[SpringBoot] (5) Spring Security OAuth 2.0 로그인 기능 (구글 소셜 로그인)

윤경·2022년 1월 28일
0

Spring Boot

목록 보기
73/79
post-custom-banner

구글이 해주는 내 로그인 기능

모든 코드는 🔗깃허브를 참고


✔️ 스프링 시큐리티와 OAuth 2.0

: Authentication(인증) + Authorization(인가)

구글 소셜 로그인 구현하기

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

OAuth 로그인 구현 시 위의 기능을 구글이 대신 수행해주기 때문에 서비스 개발에 집중할 수 있다.

1. 구글 서비스 등록

🔗구글 클라우드 플랫폼

이렇게 생성된 것을 확인할 수 있다.
이제 클라이언트 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에 등록해주어야 한다.

gitignore에 등록하기

application-oauth.properties

2. 구글 로그인 연동하기

User.java

  • @Enumerated(EnumType.STRING)
    : JPA로 DB에 저장할 때 Enum 값을 어떤 형태로 저장할 것인지 결정
    기본적으로는 int로 된 숫자가 저장되는데 그렇게 되면 그 값이 무슨 코드를 의미하는지 알 수 없기 때문에 문자열로 지정해줌

UserRepository.java

  • findByEmail
    : 소셜 로그인 반환값 중 email을 통해 이미 생성된 사용자인지 판별

⌨️ 구현해야 하는 코드

🔗깃허브

  • User.java
  • Role.java
  • UserRepository.java

⚠️ "분명 코드가 똑같은데 왜 안 되지?" 할 때는 엉뚱한 걸 import 하진 않았는지 import 체크하기

3. 스프링 시큐리티 설정하기

build.gradle에 다음 코드 추가

implementation('org.springframework.boot:spring-boot-starter-oauth2-client')

SecurityConfig.java

  • @EnableWebSecurity
    : Spring Security 설정들을 활성화
  • csrf().disable().headers().frameOptions().disable()
    : h2-console 화면을 사용하기 위해 해당 옵션들을 disable
  • authorizeRequests
    : URL 별 권한 관리를 설정하는 옵션의 시작점
    이게 선언 되어야지만 antMatchers 옵션 사용 가능
  • andMatchers
    : 권한 관리 대상을 지정하는 옵션
    URL, HTTP 메소드 별 관리 가능
  • anyRequest
    : 설정된 값 이외 나머니 URL
  • logout().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

4. 테스트하기

머스테치는 다른 언어와 같이 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로 혼자 구현하는  서비스> 를 보고 작성한 글입니다.
profile
개발 바보 이사 중
post-custom-banner

0개의 댓글