Outh2기반 소셜 로그인 기능 구현 과정

‍bng4535·2023년 3월 23일
0

문제 상황

프로젝트에 소셜 로그인 기능을 추가하고자 하였다. Spring Security를 활용하여 Form Login으로 구현하였는데, 소셜 로그인을 위한 Oauth2 방식을 적용할 때 고려해야 할 부분이 많았다.

문제점

  • 로그인 방식이 다양해질 때, 즉 Principal 객체 내용이 바뀌면 작동하지 않는다.
  • 다양한 로그인 방식을 적용할 때 controller에서 처리하는 공통 로직이 생긴다.
  • 기존에 ID, PW로 회원가입을 한 회원이 소셜로 로그인할 때 기존 회원으로 인식하지 못한다.

해결방안

  • 템플릿 엔진에서 로그인한 사용자를 구분하기 위해 Principle 객체 대신 SiteUser객체를 전달한다
  • 로그인 과정에서 반복되는 로직을 하나의 함수로 구현한다.
  • ID, PW로 회원가입 할 때 입력한 이메일과 소셜 로그인 시 사용한 이메일을 비교하여 같은 회원인지를 확인한다.

결과

https://github.com/hanbonghun/spring-QA-board/commit/a1ddb8f31c82959d67fba7f3024ec0d210364b71

후기

  • Spring Security는 기능이 매우 많고 복잡하다. 처음에는 자주 활용되니까 공통적인 구현 방식이 있겠거니하고 다른 코드를 보면서 이해하려 했는데 도무지 이해가 안됐다. 그래서 블로그나 유튜브의 강의를 통해 Oauth2가 어떻게 동작하는지 먼저 이해를 하고 코드를 다시 천천히 보았고 전체적인 흐름의 이해와 내 상황에 맞게 코드를 수정할 수 있게 되었다. 시간이 오래 걸렸지만 구현했을 때 매우 뿌듯했다.
  • http 요청이 들어온다

  • http.authorizeHttpRequests()를 통해 설정된 체인을 거친다

  • AuthenticationManager가 인증 요청을 처리할 수 있는 provider를 찾는다

  • 해당 provider는 인증 방식에 맞는Service를 수행하여 인증에 성공한 User를 반환한다


  • DefaultOAuth2UserService나 UserDetailsService를 구현하고 해당 인터페이스의 메서드를 구현하여 사용하는 것은, Authentication Provider가 인증을 어떻게 처리할지에 대한 명세

  • AuthenticationManager은 이러한 인증 Provider 중 적절한 Provider를 선택하여 인증을 수행

   @Bean
    AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
  • 위 코드는 프로바이더를 관리하는 매니저를 등록하는 과정이며, 매니저가 등록될 때 프로바이더가 등록되고 프로바이더가 어떤 과정을 통해 인증을 수행할 것인지도 등록된다.

참고

Oauth2 동작 과정 : https://lotuus.tistory.com/83
구글 로그인 : https://lotuus.tistory.com/79
Form, Oauth2 로그인 구현 : https://lotuus.tistory.com/78
WEB2 - Oauth2 : https://www.youtube.com/watch?v=hm2r6LtUbk8&t=3s

profile
공부 기록

0개의 댓글