잘못된 정보는 댓글로 의견주시면 감사하겠습니다 🙇🏻♀️
생활코딩 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 등록
- ResourceOwner가 Client가 제공하는 특정 주소로 요청
- ResourceServer는 Client id, Client secret을 비교
- 같다면 ResourceServer는 ResourceOwner에게 scope에 해당하는 정보를 Client에게 제공할 것인지를 물음
- ResourceOwner가 허용하면 ResourceServer는 특정 ResourceOwner(user id)가 Client(client id)에게 scope b, c를 허용하는 것에 동의하였다는 정보를 서버에 저장
- ResourceServer는 authorization code와 함께 리다이렉션 응답을 보냄
- Client는 client id, client secret, redirect url, authroization code와 함께 ResourceOwner를 통하지 않고 ResourceServer에 직접 접근
- ResourceServer는 authroziation code에 해당하는 정보를 Client가 보낸 정보와 비교
- 모두 일치한다면 accessToken 발급 후 Client에게 응답
- Client는 accessToken을 내부적으로 저장
- 이제 Client에서 ResourceServer에 유효한 accessToken을 넘기면 user id가 xxx이고 scope=b, c인 정보에 대해 접근할 수 있음
Spring security & OAuth를 이용한 github 소셜 로그인 예시
1. 클라이언트에서 Github 로그인 클릭
- 스프링 부트 2버전의 시큐리티에서는 기본적으로 도메인/oauth2/authorization/{소셜서비스코드}로 리다이렉트 URL을 지원
2. 소셜로그인 Authorizaiton URL로 리다이렉트
3. 클라이언트는 Location으로 요청
4. 인증 처리
- github은 로그인이 되어있는지 확인한다.
- 로그인이 되어 있다면, 요청 파라미터의 client_id, scope, redirect_uri 등을 자신이 가지고 있는 정보와 비교하고 로그인이 안 되어 있다면 로그인을 요청한다.
- 같지 않다면 인증을 여기서 끝내버리고 redirect_uri로 error와 함께 리다이렉션한다. 같다면 사용자에게 정보를 허용할 것인지를 묻는다.
- 사용자가 허용한다면 authroziation code 값과 함께 redirect_uri로 리다이렉트한다. 허용하지 않는다면 redirect_uri로 error와 함께 리다이렉트한다.
5. AbstractAuthenticationProcessingFilter에서 처리
자세한 내용은 스프링 공식 문서를 확인해 주세요.
각 메소드 호출의 자세한 내용은 [Spring Security]OAuth2LoginAuthenticationFilter의 attemptAuthentication 메소드 뿌셔보기를 참고해 주세요.
-
AbstractAuthenticationProcessingFilter 에서 하는 일을 간단히 설명하면 다음과 같습니다.
-
error 응답이 왔다면 예외를 던집니다.
-
error 응답이 아니라면
-
Client와 AccessToken 연관시키기 위한 클래스인, OAuth2AuthorizedClient를 생성합니다.
- OAuth2AuthorizedClient
-
Authorized Client를 관리하는 OAuth2AuthorizedClientRepository에 OAuth2AuthorizedClient을 저장합니다.
- OAuth2AuthorizedClientRepository