업데이트:

2 분 소요

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 단계를 정리한 그림이다.

ouath1.png

출처 : 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에 노출되기 때문에 보안상 리스크가 존재하며 이에 따라 백엔드 서버가 없는 환경에서 사용이 권장된다.

아래와 같은 프로세스를 가진다.

oauth2.png

출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html

Client Credentials Grant

client_id, client_secret 파라미터만을 가지며 Access-Token을 발급하고 이 과정에서 사용자는 전혀 관여하지 않는다. 사용자 간 직접적 상호작용 없이 백그라운드에서 실행해야하는 서버 간 상호작용에 사용된다.

oauth3.png

출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html

Resource Owner Password Credentials Grant

Client Credential Grant 방식과 유사하며 client_id, client_secret 대신 사용자 비밀번호로 인증된다는 특징을 가진다. Client를 완전히 신뢰할 수 있을 때 사용한다.

oauth4.png

출처 : https://docs.pivotal.io/p-identity/1-14/grant-types.html

댓글남기기