본문 바로가기
Spring

Spring Security 와 OAuth2 로 로그인 구현 (구글, 카카오, 네이버 등)

by 에드박 2020. 7. 25.

다음은 구글 자동로그인 구현중에 해당하는 내용입니다.

 

자동 로그인 구현을 위한 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

 

맨 마지막줄 scope=profile, email

 

scope 의 기본값은 openId, profile, email 입니다. 

강제로 profile, email 을 등록한 이유는 openId 라는 scope가 있으면 Open Id Provider 로 인식하기 때문입니다.

이렇게 되면 OpenId Provider인 서비스(구글) 과 그렇지 않은 서비스(네이버/카카오 등)로 나눠서 각각 OAuth2Service 를 만들어야한다.

 

하나의 OAuth2Service 로 사용하기 위해 일부러 openid scope 를 빼고 등록합니다.

 

깃에 git add 하기전에 .gitignore 에 application-oauth.properties 을 꼭 추가해야합니다.

 

그렇지 않으면 보안이 중요한 정보인 소셜 로그인을 위한 클라이언트ID 와 클라이언트 보안비밀 이들은 개인정보를 가져갈 수 있는 취약점이 될 수 있기 때문입니다.

 

 

Oauth 라이브러리를 이용한 소셜 로그인 설정 SecurityConfig 클래스

package com.book.spring.park.config.auth;

import com.book.spring.park.domain.user.Role;
import lombok.RequiredArgsConstructor;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@RequiredArgsConstructor
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    private final CustomOAuth2UserService customOAuth2UserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .headers().frameOptions().disable()
                .and()
                    .authorizeRequests()
                    .antMatchers("/", "/css/**", "/images/**",
                            "/js/**", "/h2-console/**").permitAll()
                    .antMatchers("/api/v1/**").hasRole(Role.USER.name())
                    .anyRequest().authenticated()
                .and()
                    .logout()
                        .logoutSuccessUrl("/")
                .and()
                    .oauth2Login()
                        .userInfoEndpoint()
                            .userService(customOAuth2UserService);
    }
}

@EnableWebSecurity

- Spring Security 설정들을 활성화 시켜 줍니다.

 

csrf().disable().header().frameOptions().disable()

- h2-console 화면을 사용하기 위해 해당 옵션들을 disable 합니다.

 

authorizeRequests

- URL별 권한 관리를 설정하는 옵션의 시작점입니다.

 

antMatchers

- 권한 관리 대상을 지정하는 옵션입니다.

- URL, HTTP 메소드별로 관리가 가능합니다.

- "/"등 지정된 URL들은 permitAll() 옵션을 통해 전체 열람 권한을 주었습니다.

- "/api/v1/**" 주소를 가진 API는 USER 권한을 가진 사람만 가능하도록 했습니다.

 

anyRequest

- 설정된 값들 이외 나머지 URL들을 나타냅니다.

- 여기서는 authenticated()을 추가하여 나머지 URL들은 모두 인증된 사용자들에게만 허용하게 합니다.

- 인증된 사용자 즉, 로그인한 사용자들을 이야기합니다.

 

logout().logoutSuccessUrl("/")

- 로그아웃 기능에 대한 여러 설정의 진입점입니다.

- 로그아웃 성공 시 주소로 이동합니다.

 

oauth2Login

- OAuth 2 로그인 기능에 대한 여러 설정의 진입점 입니다.

 

userInfoEndpoint

- Oauth 2 로그인 성공 이후 사용자 정보를 가져올 때의 설정들을 담당합니다.

 

userService

- 소셜 로그인 성공 시 후속 조치를 진행할 UserService 인터페이스의 구현체를 등록합니다.

- 리소스 서버(즉, 소셜 서비스들)에서 사용자 정보를 가져온 상태에서 추가로 진행하고자 하는 기능을 명시할 수 있습니다.

 


참고 문서 - 이동욱 개발자님의 [스프링 부트와 AWS로 혼자 구현하는 웹 서비스]

스프링을 시작하시는 분들에게 꼭꼭 추천해드리고 싶습니다.

https://jojoldu.tistory.com/463
 

[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 출간 후기

(출판사: 프리렉, 쪽수: 416, 정가: 22,000원) 서적 링크 오프라인 서점에는 2019.12.04 (수) 부터 올라갈 예정입니다. 강남 교보문고나 광화문 교보문고는 주말에도 올라올 순 있겠지만, 혹시 모르니 ��

jojoldu.tistory.com

 

댓글