[Spring] Spring과 OAuth2.0
업데이트:
Oauth2.0
사용자가 가입된 서비스에서 제공하는 API를 이용해 사용자 데이터에 접근하기 위해서 사용자의 패스워드 없이 권한을 위임 받을 수 있는 표준 인증 프로토콜
OAuth 주요 용어
-
Resource Owner
서비스를 이용하는 사용자
-
Client
리소스 소유자를 대신해 보호된 리소스에 액세스하는 응용 프로그램(ex. 개발자)
-
Resource Server
보호받는 리소스를 호스팅하고 액세스 토큰을 사용하는 클라이언트의 요청을 수락하고 응답할 수 있는 서버(ex. 네이버 서버 등)
-
Authorization Server
클라이언트 및 리소스 소유자를 성공적으로 인증한 후 액세스 토큰을 발급하는 서버(ex. 네이버 인증 서버 등)
Oauth에서는 Authorization Code Grant, Implicit Grant, Client Credentials Grant, Resource Owner Password Credentials Grant 총 4가지의 방법을 통해 토큰 발급을 요청할 수 있다.
Authorization Code Grant
Oauth에서 가장 중요하고 널리사용되는 인증 방법으로 Server to Server 인증 방식을 이용한다. 따라서 백엔드 서버가 존재하는 웹/모바일 서비스에 적합하며 보안이 우수하다는 장점이 있다.
전체적인 과정은 아래와 같다.
사용자 인증 → Callback → Authorization 코드 획득 → client-id, client-secret, Access-Token으로 교환
위 과정은 4과정에 의해 발생하며 각 과정에 대해서 알아본다.
Authorization Request
사용자가 인증요청을 하는 단계로 Client가 Authorization Server에 요청을 보낸다. 즉 Client가 Resource Owner를 Authorization Server로 리다이렉션을 한다.
URL요청을 전송할 때 사용되는 파라미터는 다음과 같다.
-
response_type
response_type의 value는 code로 고정되어 있어야 한다.
-
client_id
Authorization Server에서 클라이언트를 식별하기 위한 키
-
redirect_uri
Authorization Server에서 처리 완료 후 리다이렉션 하기 위한 URL
-
scope
클라이언트가 요구하는 리소스를 정의
-
state
클라이언트는 임의의 문자열을 생성해 CSRF 공격을 방지
해당 파라미터들을 담은 URL 요청은 아래 예시와 같이 나타날것이다.
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=0492f15cb715d60526a3eb9e2323c559&scope=profile_nickname%20profile_image&state=xI8tRNCSoeiAIw87NaUr5foPbhBhW2METzHDBK75jgo%3D&redirect_uri=http://localhost:8080/login/oauth2/code/kakao\
Authorization Response
Client에서 요구하는 리소스에 대해 사용자 동의를 받고 요청과 함께 전달된 redirect_uri로 리다이렉션한다. 즉 Client의 uri로 리다이렉션한다.
해당 응답에서 가지는 파라미터는 다음과 같다.
-
code
Access-Token 교환을 위한 승인 코드
-
state
요청과 함께 전달 된 임의의 문자열
아래 예시와 같은 URL이 표현된다.
/login/oauth2/code/kakaocode=jzcahTyqbAx4zs9pKfBDlGXmB36sPX2YJCNIIw0RKkW_ODsYTQpheSGABo17dHC5rXRD2Qopb9QAAAF76FELEg&state=xI8tRNCSoeiAIw87NaUr5foPbhBhW2METzHDBK75jgo%3D
Token Request
해당 과정에서는 승인 코드를 Access-Token으로 교환 한다. 교환 과정에 들어가는 파라미터는 다음과 같다.
-
grant_type
authorization_code로 고정이다.
-
code
이 전 단계에서 전달 받은 코드
-
client_id
Authorization Server에서 클라이언트를 식별하기 위한 키
-
client_secret
클라이언트 비밀키
HTTP POST [https://kauth.kakao.com/oauth/token](https://kauth.kakao.com/oauth/token)
Accept= [application/json, application/*+json]
Writing [
{grant_type=[authorization_code],
code=[jzcahTyqbAx4zs9pKfBDlGXmB36sPX2YJCNIIw0RKkW_ODsYTQpheSGABo17dHC5rXRD2Qopb9QAAAF76FELEg],
redirect_uri=[[http://localhost:8080/login/oauth2/code/kakao](http://localhost:8080/login/oauth2/code/kakao)],
client_id=[0492f15cb715d60526a3eb9e2323c559],
client_secret=[oqoKOBecGMC45Uh7z7bmdtMJ0A4PSQ2l]}
] as "application/x-www-form-urlencoded;charset=UTF-8"
Token Response
Authorization Server로 부터 Client가 Access-Token과 함게 부가정보를 획득하는 단계이다. Client는 access_token을 통해 리소스 요청을 하고 refresh_token을 통해 access-Token을 갱신할 수 있다.
아래는 위 4 단계를 정리한 그림이다.
출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html
Implicit Grant
Implicit Grant 방식은 Authorization Code grant 방식에 비해 간단하며 redirect uri로 Access-Token이 전달 된 후 Token Request 단계가 생략된다는 특징을 가지고 있다.
하지만 Access-Token이 URL에 노출되기 때문에 보안상 리스크가 존재하며 이에 따라 백엔드 서버가 없는 환경에서 사용이 권장된다.
아래와 같은 프로세스를 가진다.
출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html
Client Credentials Grant
client_id, client_secret 파라미터만을 가지며 Access-Token을 발급하고 이 과정에서 사용자는 전혀 관여하지 않는다. 사용자 간 직접적 상호작용 없이 백그라운드에서 실행해야하는 서버 간 상호작용에 사용된다.
출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html
Resource Owner Password Credentials Grant
Client Credential Grant 방식과 유사하며 client_id, client_secret 대신 사용자 비밀번호로 인증된다는 특징을 가진다. Client를 완전히 신뢰할 수 있을 때 사용한다.
출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html
댓글남기기