Skip to content

OAuth

Posted on:2024년 2월 3일 at 오후 02:26

TOC

📌 OAuth 2.0

OAuth 2는 페이스북, 깃허브, 구글과 같은 응용 프로그램들이 HTTP 서비스에서 사용자 계정에 대한 제한된 접근을 얻을 수 있도록 하는 권한 부여 프레임워크이다.

📌 역할

client

Resource Owner

Resource Server

Authorization Server

📌 authentication(인증)과 authorization(인가)의 차이

인증

인가

📌 Abstract Protocol Flow

image

(A) client는 resource owner에게 권한을 요청한다.
(B) resource owner가 권한 요청을 승인하면 client는 권한 부여를 받는다.
(C) client는 자신의 신원에 대한 인증을 제시함으로써 authorization server에 엑세스 토큰을 요청하고 ,인가 허가를 받는다.
(D) client id가 인증되고 인가 허가가 유효한 경우 , authorization server는 client에 엑세스 토큰을 발행한다.
(E) client 는 resource server에 리소스를 요청하고 인증을 위한 엑세스 토큰을 제시한다.
(F) 엑세스 토큰이 유효한 경우 resource server는 리소스를 client에게 제공한다.

: 실제 과정은 권한 부여 유형에 따라 다르지만 일반적인 과정이다

📌등록

OAuth를 사용하기 전에 애플리케이션을 서비스에 등록해야한다.등록할 때 주로 애플리케이션 이름과 웹사이트 등 기본정보를 입력한다. 또한 사용자를 리디렉션할 redirect url를 등록해야한다.

Redirect URLs

등록한 url로만 리디렉션하여 일부 공격을 방지하는데 도움이 된다.
redirect url는 https를 통해 제공되며 이를 통해 인증 과정에서 토큰이 가로채지는 것을 방지할 수 있다.

Client ID and Secret

애플리케이션을 등록하면 client ID와 client secret을 받게 된다. client id는 공개 정보이며 로그인 url을 구축하는데 사용되거나 페이지의 자바스크립트 소스 코드에 포함된다. client secret은 반드시 비밀로 유지되어야한다.

📌Authorization Grant

✨Authorization Code

https://example.com/login/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&scope=SCOPE&response_type=code

resource owner에게 다음과 같은 링크를 준다.
https://example.com/login/oauth/authorize** : api 승인 엔드 포인트 client_id=YOUR_CLIENT_ID : client id redirect_uri=YOUR_REDIRECT_URI : 인증 코드가 부여된 뒤 리다이렉트 할 url response_type=code : 애플리케이션이 인증 코드 부여을 요청하고 있음을 지정한다. scope=SCOPE : 애플레케이션이 요청하는 엑세스 수준을 지정한다.

Step 2 - 사용자가 애플리케이션을 승인한다.

Step 3 - 애플리케이션이 authorization code을 받는다.

https://example.com/callback?code=AUTHORIZATION_CODE

Step 4 - 애플리케이션은 엑세스 토큰을 요청한다.

https://example.com/login/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

Step 5 - 애플리케이션이 엑세스 토큰을 받는다.

{
	"access_token":"ACCESS_TOKEN",
	"token_type":"bearer",
	"expires_in":2592000,
	"refresh_token":"REFRESH_TOKEN",
    "scope":"read",
    "uid":100101,
    "info":{.....}
}

정리

1.  클라이언트 애플리케이션은 사용자를 인증 서버의 로그인 페이지로 리다이렉트한다. 이 페이지에서 사용자는 자신의 아이디와 비밀번호를 입력하여 로그인한다.
2. 사용자가 로그인에 성공하면, 인증 서버는 클라이언트 애플리케이션에 대한 권한을 사용자에게 요청한다.
3. 사용자가 클라이언트 애플리케이션의 접근을 허용하면, 인증 서버는 사용자를 클라이언트 애플리케이션으로 리다이렉트한다. 이 리다이렉트 URL에는 "인증 코드"가 포함되어 있다.
4. 클라이언트 애플리케이션은 이 인증 코드를 인증 서버에 제출한다. 클라이언트 애플리케이션은 자신의 클라이언트 아이디와 시크릿을 함께 제출하여 자신을 인증한다.
5. 인증 서버는 클라이언트 애플리케이션을 인증하고, 인증 코드를 확인한 후, 액세스 토큰을 클라이언트 애플리케이션에게 발급한다.

✨Client Credentials

https://example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
  1. 애플리케이션은 client id와 client secret를 사용하여 인증 서버에 액세스 토큰을 HTTP POST 요청을 한다.
  2. authorization server는 애플리케이션의 자격증명을 검증하고 자격증명이 유효하면 인증 서버는 액세스 토큰을 애플리케이션에 반환한다.
  3. 애플리케이션은 이 토큰을 사용하여 API에 접근하고, 필요한 작업을 수행한다.

✨Device Code

POST https://oauth.example.com/device

client_id=CLIENT_id
{
  "device_code": "IO2RUI3SAH0IQuESHAEBAeYOO8UPAI",
  "user_code": "RSIK-KRAM",
  "verification_uri": "https://example.okta.com/device",
  "interval": 10,
  "expires_in": 1600
}

참고
https://www.digitalocean.com/community/tutorials/an-introduction-to-oauth-2#client-credentials-flow
https://aaronparecki.com/oauth-2-simplified/#others
https://datatracker.ietf.org/doc/html/rfc6749