2.스프링 시큐리티 [OAuth 로그인 -2]

dasd412·2022년 1월 31일
0

포트폴리오

목록 보기
15/41

구글 프로필 정보 받아오기

구글 Oauth 절차

  1. 코드 받기 (인증)

  2. 액세스 토큰 받기 (권한)

  3. 사용자 프로필(이메일,이름,아이디,전화번호 까지만) 정보 가져옴

  4. 그 정보를 토대로 회원 가입 자동 진행도 함.

  5. 추가적인 정보(집 주소 등)가 필요하다면 추가적인 회원가입 절차가 필요함.


구글 로그인 이후의 후처리를 담당하는 서비스 만들기

DefaultOAuth2UserService 를 상속한 클래스를 @Service로 등록하자.
그리고 loadUser()라는 메서드를 재정의하자.
이 메서드는 구글 Oauth 로그인 이후의 후처리를 담당한다.

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {

    //구글로부터 받은 userRequest 데이터에 대한 후처리를 담당하는 메서드
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        System.out.println("getClientRegistration : "+userRequest.getClientRegistration());
        System.out.println("getAccessToken : "+userRequest.getAccessToken());
        //구글 로그인 버튼 클릭 -> 구글 로그인 창 -> 로그인 완료-> code를 리턴 -> Oauth라이브러리가 받음 ->Access token 요청
				//위 과정까지가 UserRequest 정보이다.
				//이 UserRequest 정보를 이용해 회원프로필을 받아야하는데, 이때 사용되는게 이 loadUser() 메서드이다.
        System.out.println("getAttributes : "+super.loadUser(userRequest).getAttributes());
        return super.loadUser(userRequest);
    }
}

userRequest.getClientRegistration()를 보면, registrationId를 이용해 어떤 Oauth로 로그인하였는지 알 수 있다.

loadUser().getAttributes()를 출력해보면 다음과 같은 형식으로 프로필 정보가 나온다.

sub는 구글 회원의 기본키라고 보면 된다.

{sub= ,
 name= , 
 given_name= , 
 family_name= ,
 picture= ,
 email=, 
 email_verified= , 
 locale=ko}

설정용 클래스에 DefaultOAuth2UserService 상속체 넣기

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true,prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private PrincipalOauth2UserService principalOauth2UserService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();//<-사이트 간 위조 요청 방지를 disable한 것.

        http.authorizeRequests()
                .antMatchers("/user/**").authenticated()
                .antMatchers("/manager/**").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_MANAGER')")
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/loginForm")
                .loginProcessingUrl("/login")
                .defaultSuccessUrl("/") 
                .and()
                .oauth2Login()
                .loginPage("/loginForm")
                .userInfoEndpoint()//구글 로그인이 완료된 뒤 후처리 필요. 구글은 코드를 안주고 액세스 토큰 + 사용자 프로필 정보를 제공함.
                .userService(principalOauth2UserService);
    }
}

구글 자동 로그인 해제 하기

어플리케이션 테스트 시, 최초 로그인 이후에는 계정 선택 화면 선택 없이 자동 로그인이 된다.

이를 해제하는 방법은 다음을 참조하면 된다.
https://m.blog.naver.com/ezpbill/221799781305

profile
시드 레벨 스타트업의 2호 직원으로서 백엔드 시스템의 70%를 설계 및 개발하였고, TIPS 5억 투자 유치에 기여한 서버 개발자입니다. (Go/Python/MSA/Spring)

0개의 댓글