TOC
- ๐ OAuth 2.0
- ๐ ์ญํ
- ๐ authentication(์ธ์ฆ)๊ณผ authorization(์ธ๊ฐ)์ ์ฐจ์ด
- ๐ Abstract Protocol Flow
- ๐๋ฑ๋ก
- ๐Authorization Grant
๐ OAuth 2.0
OAuth 2๋ ํ์ด์ค๋ถ, ๊นํ๋ธ, ๊ตฌ๊ธ๊ณผ ๊ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ๋ค์ด HTTP ์๋น์ค์์ ์ฌ์ฉ์ ๊ณ์ ์ ๋ํ ์ ํ๋ ์ ๊ทผ์ ์ป์ ์ ์๋๋ก ํ๋ ๊ถํ ๋ถ์ฌ ํ๋ ์์ํฌ์ด๋ค.
๐ ์ญํ
client
- ์ฌ์ฉ์์ ๊ณ์ ์ ์ ์ํ ๋ ค๋ ํ๋ก๊ทธ๋จ
- ๋ฆฌ์์ค ์๋ฒ์ ์ ์ํด์ ์์์ ๊ฐ์ ธ๊ฐ๋ค.
ex) ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์๋น์ค
Resource Owner
- ๋ฆฌ์์ค ์์ ์๋ ์์ ์ ๊ณ์ ์ผ๋ถ์ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋ ์ฌ์ฉ์
- ex) user
Resource Server
- ์ฌ์ฉ์์ ์ ๋ณด์ ์ ๊ทผํ๋ ค๋ api
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋ฒ
- ex) facebook,google ๋ฐ์ดํฐ ์๋ฒ
Authorization Server
- ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋ฒ
- ์ฌ์ฉ์๊ฐ ์์ฒญ์ ์น์ธํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ์๋ฒ
- ์๊ท๋ชจ ๊ตฌํ์์๋ api ์๋ฒ์ ๋์ผํ ์๋ฒ์ผ ์ ์์ง๋ง ๋๊ท๋ชจ ๊ตฌํ์์๋ ๋ณ๋์ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ถ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ex) facebook,google ์ธ์ฆ ์๋ฒ
๐ authentication(์ธ์ฆ)๊ณผ authorization(์ธ๊ฐ)์ ์ฐจ์ด
์ธ์ฆ
- ์ฌ์ฉ์๊ฐ ์์ ์ ์๋ณํ๋ ํ๋ก์ธ์ค
- โ๋๊ตฌโ์ธ์ง ํ์ธํ๊ณ ์ฌ์ฉ์์ ์ ์์ ํ์ธํ๋ค.
- ex) ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๊ณ ์์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๊ณตํ์ฌ ์์คํ ์ ๋ก๊ทธ์ธํ ๋ ์ด๋ฃจ์ด์ง๋ ๊ณผ์
์ธ๊ฐ
- ์ธ์ฆ ํ ์ด๋ค ์์ ์ด๋ ์์์ ๋ํ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๊ฑฐ๋ ๊ฑฐ๋ถํ๋ ํ๋ก์ธ์ค
- โ๋ฌด์โ์ ๋ํ ์์ธ์ค ๊ถํ์ ๊ด๋ฆฌํ๋ค.
- ex) ๋ก๊ทธ์ธ ํ์ ํน์ ํ์ผ์ ๋ํ ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ ๊ถํ์ ์ป๋ ๊ณผ์
๐ Abstract Protocol Flow
(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
- ์ abstract protocol flow์ ์ฒ์ 4๋จ๊ณ๋ ์ธ๊ฐ๋ถ์ฌ์ ์์ธ์ค ํ ํฐ์ ์ป๋๊ฒ์ ๋ค๋ฃฌ๋ค.
- authorization grant ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ธ๊ฐ๋ฅผ ์์ฒญํ๋ ๋ฐฉ๋ฒ๊ณผ api๊ฐ ์ง์ํ๋ ํ๊ฐ ์์ฒญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ouath2๋ ์ธ๊ฐ์ง ์ฃผ์ ํ๊ฐ ์ ํ์ด ์๋ค.
- Authorization Code : ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ค.
- Client Credentials : api ์์ธ์ค ๊ถํ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ค.
- Device Code : ๋ธ๋ผ์ฐ์ ๊ฐ ์๊ฑฐ๋ ์ ๋ ฅ ์ ํ์ด ์๋ ์ฅ์น์์ ์ฌ์ฉ๋๋ค.
โจAuthorization Code
- ์์ค ์ฝ๋๊ฐ ๊ณต๊ฐ์ ์ผ๋ก ๋ ธ์ถ๋์ง ์๋ server-side ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํ ๋์ด์๋ค.
- HTTP ๋ฆฌ๋ค์ด๋ ์ ์ ํ ํด resource owner๊ฐ ์ง์ ์ฝ๋๋ฅผ ํ๋ํ๋ ๋ฐฉ์์ด๋ค.
- ๊ฐ์ฅ ๋ํ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
Step 1 - Authorization Code link
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
- ์๋น์ค๋ authorization code์ ํจ๊ป ๋ฑ๋ก ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฆฌ๋๋ ์ URI๋ก ๋ฆฌ๋๋ ์ ํ๋ค.
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
- ์ ํ๋ฆฌ์ผ์ด์ ์ client secret์ ํฌํจํ ์ธ์ฆ ์ ๋ณด์ ํจ๊ป ์ธ์ฆ ์ฝ๋๋ฅผ api ํ ํฐ ์๋ํฌ์ธํธ๋ก ์ ๋ฌํจ์ผ๋ก์จ api๋ก๋ถํฐ ์์ธ์ค ํ ํฐ์ ์์ฒญํ๋ค.
Step 5 - ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ธ์ค ํ ํฐ์ ๋ฐ๋๋ค.
{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{.....}
}
- ์ธ๊ฐ๊ฐ ์ ํจํ ๊ฒฝ์ฐ api๋ ์์ธ์ค ํ ํฐ์ ํฌํจํ๋ ์๋ต์ ๋ณด๋ธ๋ค.
- ํ ํฐ์ ์ฌ์ฉํ์ฌ ํ ํฐ์ด ๋ง๋ฃ๋๊ฑฐ๋ ์ทจ์๋ ๋ ๊น์ง api๋ฅผ ํตํด ์ฌ์ฉ์ ๊ณ์ ์ ์ ๊ทผํ ์ ์๋ค.
- ๋ฆฌํ๋ ์ฌ ํ ํฐ์ด ๋ฐํ๋ ๊ฒฝ์ฐ, ์๋ ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ ์๋ก์ด ์์ธ์ค ํ ํฐ์ ์์ฒญํ๋ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ฆฌ
1. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆ ์๋ฒ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ค. ์ด ํ์ด์ง์์ ์ฌ์ฉ์๋ ์์ ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ์ฌ ๋ก๊ทธ์ธํ๋ค.
2. ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด, ์ธ์ฆ ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ๊ถํ์ ์ฌ์ฉ์์๊ฒ ์์ฒญํ๋ค.
3. ์ฌ์ฉ์๊ฐ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ทผ์ ํ์ฉํ๋ฉด, ์ธ์ฆ ์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ค. ์ด ๋ฆฌ๋ค์ด๋ ํธ URL์๋ "์ธ์ฆ ์ฝ๋"๊ฐ ํฌํจ๋์ด ์๋ค.
4. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด ์ธ์ฆ ์ฝ๋๋ฅผ ์ธ์ฆ ์๋ฒ์ ์ ์ถํ๋ค. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์ ํด๋ผ์ด์ธํธ ์์ด๋์ ์ํฌ๋ฆฟ์ ํจ๊ป ์ ์ถํ์ฌ ์์ ์ ์ธ์ฆํ๋ค.
5. ์ธ์ฆ ์๋ฒ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ธ์ฆํ๊ณ , ์ธ์ฆ ์ฝ๋๋ฅผ ํ์ธํ ํ, ์ก์ธ์ค ํ ํฐ์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์๊ฒ ๋ฐ๊ธํ๋ค.
โจClient Credentials
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋น์ค ๊ณ์ ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ api์ ์ ๊ทผํด์ผํ ๋ ์ฌ์ฉ๋๋ค.
https://example.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
- ์ ํ๋ฆฌ์ผ์ด์ ์ client id์ client secret๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ ์๋ฒ์ ์ก์ธ์ค ํ ํฐ์ HTTP POST ์์ฒญ์ ํ๋ค.
- authorization server๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฒฉ์ฆ๋ช ์ ๊ฒ์ฆํ๊ณ ์๊ฒฉ์ฆ๋ช ์ด ์ ํจํ๋ฉด ์ธ์ฆ ์๋ฒ๋ ์ก์ธ์ค ํ ํฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐํํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ํ ํฐ์ ์ฌ์ฉํ์ฌ 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