OAuth, Spring Security & OAuth 소셜 로그인

hyng·2022년 2월 10일
0

잘못된 정보는 댓글로 의견주시면 감사하겠습니다 🙇🏻‍♀️

생활코딩 OAuth2.0 강의를 보고 정리한 내용입니다.

OAuth란?

  • 사용자의 구글 캘린더의 정보를 수정하는 나의 서비스가 있다고 가정
  • 나의 서비스가 사용자를 대신해서 구글 달력에 접근하는 가장 쉬운 방법은 구글 계정의 id, pw를 사용자로부터 전달받아서 전달받은 id, pw로 구글에 접속하는 방법
  • 하지만 이 방법은 보안 문제, 관리 문제 등 상당히 위험한 방법
  • 이럴 때 사용할 수 있는 것이 OAuth!
  • OAuth는 사용자로부터 id, pw를 입력받아 해당 정보를 사용하는 게 아니라 google, github, kakao 같은 서비스에서 accessToken을 발급해 주는 것

OAuth 용어

  • OAuth 과정을 살펴보기 앞서 OAuth에 등장하는 여러 용어들을 먼저 알아야 한다.
  • ResourceOwner
    • 나의 서비스를 사용하는 사용자인 동시에 정보의 소유주
  • Client
    • 나의 서비스임과 동시에 google, github가 제공하는 서비스를 이용하는 클라이언트
  • ResourceServer
    • 나의 서비스에게 서비스를 제공하는 서버
    • OAuth 공식 문서에서는 '인증'을 제공하는 Authorization Server가 따로 있지만 여기서는 편의를 위해 둘을 합쳐 ResourceServer로 설명

OAuth 과정

  • 우선 ResourceServer에 나의 서비스를 등록하는 과정이 필요하다.
  • 기본적으로 Client id, Client secret, Redirect URls 등록
  1. ResourceOwner가 Client가 제공하는 특정 주소로 요청
  2. ResourceServer는 Client id, Client secret을 비교
  3. 같다면 ResourceServer는 ResourceOwner에게 scope에 해당하는 정보를 Client에게 제공할 것인지를 물음
  4. ResourceOwner가 허용하면 ResourceServer는 특정 ResourceOwner(user id)가 Client(client id)에게 scope b, c를 허용하는 것에 동의하였다는 정보를 서버에 저장
  5. ResourceServer는 authorization code와 함께 리다이렉션 응답을 보냄
  6. Client는 client id, client secret, redirect url, authroization code와 함께 ResourceOwner를 통하지 않고 ResourceServer에 직접 접근
  7. ResourceServer는 authroziation code에 해당하는 정보를 Client가 보낸 정보와 비교
  8. 모두 일치한다면 accessToken 발급 후 Client에게 응답
  9. Client는 accessToken을 내부적으로 저장
  10. 이제 Client에서 ResourceServer에 유효한 accessToken을 넘기면 user id가 xxx이고 scope=b, c인 정보에 대해 접근할 수 있음

Spring security & OAuth를 이용한 github 소셜 로그인 예시

  • SpringBoot 2버전 사용

1. 클라이언트에서 Github 로그인 클릭

  • 스프링 부트 2버전의 시큐리티에서는 기본적으로 도메인/oauth2/authorization/{소셜서비스코드}로 리다이렉트 URL을 지원

2. 소셜로그인 Authorizaiton URL로 리다이렉트

3. 클라이언트는 Location으로 요청

4. 인증 처리

  1. github은 로그인이 되어있는지 확인한다.
  2. 로그인이 되어 있다면, 요청 파라미터의 client_id, scope, redirect_uri 등을 자신이 가지고 있는 정보와 비교하고 로그인이 안 되어 있다면 로그인을 요청한다.
  3. 같지 않다면 인증을 여기서 끝내버리고 redirect_uri로 error와 함께 리다이렉션한다. 같다면 사용자에게 정보를 허용할 것인지를 묻는다.
  4. 사용자가 허용한다면 authroziation code 값과 함께 redirect_uri로 리다이렉트한다. 허용하지 않는다면 redirect_uri로 error와 함께 리다이렉트한다.

5. AbstractAuthenticationProcessingFilter에서 처리

자세한 내용은 스프링 공식 문서를 확인해 주세요.

각 메소드 호출의 자세한 내용은 [Spring Security]OAuth2LoginAuthenticationFilter의 attemptAuthentication 메소드 뿌셔보기를 참고해 주세요.

  • AbstractAuthenticationProcessingFilter 에서 하는 일을 간단히 설명하면 다음과 같습니다.

  • error 응답이 왔다면 예외를 던집니다.

  • error 응답이 아니라면

    • ResourceServer로부터 전달 받은 code정보와 함께 OAuth2LoginAuthenticationToken을 생성하고 AuthenticationManager에게 인증 처리를 위임합니다.

    • 해당 Authentication 타입을 지원하는OAuth2LoginAuthenticationProvider가 인증을 처리하게 됩니다.

      • 인증을 처리한 후, OAuth2User와 OAuth2LoginAuthenticationToken을 연관시키기 위해 CustomOAuth2UserService.loadUser()를 호출해 OAuth2User를 얻습니다.

      • 그 후 인증이 완료된 OAuth2LoginAuthenticationToken을 생성해서 반환합니다.

  • Client와 AccessToken 연관시키기 위한 클래스인, OAuth2AuthorizedClient를 생성합니다.

    • OAuth2AuthorizedClient
  • Authorized Client를 관리하는 OAuth2AuthorizedClientRepository에 OAuth2AuthorizedClient을 저장합니다.

    • OAuth2AuthorizedClientRepository
profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글