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