๐ฉ Authorization Code์ด๋?
๐ธ Authorization Code โ ํ ํฐ์ด ์๋๋ผ, ํ ํฐ์ ์ป๊ธฐ ์ํ ์์ ์ฝ๋์
โ
OAuth 2.0 & OIDC ๋ก๊ทธ์ธ ํ๋ฆ
์ด ํ๋ฆ์ OAuth 2.0์ ํ์ค ํ๋ฆ์ผ๋ก,
๊ตฌ๊ธ, ๋ค์ด๋ฒ, ์นด์นด์ค, ์ ํ ๋ฑ ๋๋ถ๋ถ์ OAuth ์ธ์ฆ ์ ๊ณต์(IdP)์์ ์ ์ฌํ๊ฒ ์ฌ์ฉ๋จ
๐น ๊ตฌ๊ธ, ์ ํ โ OAuth 2.0 + OpenID Connect (OIDC)๋ฅผ ์ฌ์ฉ
๐น ๋ค์ด๋ฒ, ์นด์นด์ค, ํ์ด์ค๋ถ โ ๋๋ถ๋ถ OAuth 2.0๋ง ์ฌ์ฉ (ID Token ๋ฐํ X ๋๋ ์ ํ)
๐ฉ OAuth 2.0 ํ์ค ๋ก๊ทธ์ธ ํ๋ฆ (Access Token ์ค์ฌ)
๋ชจ๋ OAuth 2.0 ์ธ์ฆ ์ ๊ณต์(IdP)์ ์ ์ฉ ๊ฐ๋ฅ
- ์ฌ์ฉ์๊ฐ ํด๋ผ์ด์ธํธ(์น/์ฑ)์์ ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
- ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์๋ฅผ OAuth ์๋ฒ(๋ค์ด๋ฒ, ์นด์นด์ค, ํ์ด์ค๋ถ ๋ฑ)๋ก ๋ฆฌ๋๋ ํธ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ โ Authorization Code ๋ฐํ
- ํด๋ผ์ด์ธํธ๋ Authorization Code๋ฅผ ์๋ฒ๋ก ์ ์ก
- ์๋ฒ๋ Authorization Code๋ก Access Token ์์ฒญ(Client Secret๊ฐ์ด ๋ณด๋)
- OAuth ์๋ฒ๊ฐ Access Token ๋ฐํ
- ์๋ฒ๋ Access Token์ ์ฌ์ฉํด ์ฌ์ฉ์ ์ ๋ณด API ํธ์ถ
๐ฉ ๊ตฌ๊ธ/์ ํ ๋ก๊ทธ์ธ ํ๋ฆ (OIDC ๊ธฐ๋ฐ)
๊ตฌ๊ธ, ์ ํ ๋ฑ OpenID Connect(OIDC)๋ฅผ ์ง์ํ๋ ์๋น์ค์ ํด๋น๋จ
- ์ฌ์ฉ์๊ฐ ํด๋ผ์ด์ธํธ(์น/์ฑ)์์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
- ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์๋ฅผ ๊ตฌ๊ธ OIDC ์๋ฒ๋ก ๋ฆฌ๋๋ ํธ
- ์ฌ์ฉ์๊ฐ ๊ตฌ๊ธ์ ๋ก๊ทธ์ธ โ Authorization Code ๋ฐํ
- ํด๋ผ์ด์ธํธ๋ Authorization Code๋ฅผ ์๋ฒ๋ก ์ ์ก
- ์๋ฒ๋ Authorization Code๋ก Access Token + ID Token ์์ฒญ
- ๊ตฌ๊ธ์ด ์๋ฒ์ Access Token + ID Token(JWT) ๋ฐํ
- ์๋ฒ๋ ID Token์ ๋์ฝ๋ฉํด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ ,
์์ฒด์ ์ผ๋ก JWT๋ฅผ ์์ฑํ๊ฑฐ๋ ์ธ์
๊ด๋ฆฌ
๐ฉ PKCE(Proof Key for Code Exchange)๋?
PKCE๋ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ ์ ์ฅํ ์ ์๋ ํ๊ฒฝ์์ ์ฌ์ฉ๋๋ ๋ณด์ ๊ฐํ ๋ฐฉ์์
๐ PKCE๊ฐ ํ์ํ ์ด์
- SPA (React, Vue ๋ฑ)
- ๋ชจ๋ฐ์ผ ์ฑ
- ๋ฐ์คํฌํฑ ์ฑ
๐ ๊ณต๊ฐ ํด๋ผ์ด์ธํธ(Public Client)์์๋ Client Secret์ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์์
๐ Authorization Code ํ์ทจ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ PKCE๊ฐ ํ์ํจ
โ
PKCE ์ธ์ฆ ํ๋ฆ
- ํด๋ผ์ด์ธํธ๋ Authorization ์์ฒญ ์ ์ code_challenge ์์ฑ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ โ Authorization Code ๋ฐํ
- ํด๋ผ์ด์ธํธ๋ Authorization Code์ ํจ๊ป code_verifier ์ ์ก
- ๊ตฌ๊ธ์ code_verifier ๊ฒ์ฆ ํ Access Token + ID Token ๋ฐ๊ธ
๐ฉ ํ๋ฆ ๋น๊ต
| PKCE ์๋ ๊ฒฝ์ฐ | PKCE ์๋ ๊ฒฝ์ฐ |
|---|
| Authorization Code ํ์ทจ ๊ฐ๋ฅ | code_verifier๋ก ํ์ทจ ๋ฐฉ์ง |
| ํ ํฐ ๊ตํ ์ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ ํ์ | ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ ์์ด๋ ์์ ํ๊ฒ ๊ตํ |
โ
PKCE ์๋ ๊ฒฝ์ฐ ์ํ์ฑ
๐ธ Authorization Code๊ฐ ๊ณต๊ฒฉ์์๊ฒ ํ์ทจ๋ ๊ฒฝ์ฐ
๐ธ ๊ณต๊ฒฉ์๊ฐ ์
์ฑ ํด๋ผ์ด์ธํธ์์ Access Token ๊ตํ ๊ฐ๋ฅ
โ
์๋ฒ์ฌ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ PKCE ํ์ ์์
๐น ์๋ฒ์ฌ์ด๋ ์น ์ฑ(Spring Boot ๋ฑ)์ Client Secret์ ์์ ํ๊ฒ ์ ์ฅํ ์ ์์
๐น ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ Authorization Code๋ง ๋ฐ์ ์๋ฒ์์ ์ง์ ํ ํฐ ๊ตํ
๐น ํ ํฐ ์์ฒญ ์ Client Secret ์ฌ์ฉ โ ๋ธ๋ผ์ฐ์ ์๋ ๋
ธ์ถ๋์ง ์์
โ
ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ(Client Secret)์ด๋?
๐ธ OAuth 2.0์์ ์๋ฒ์ ์ธ์ฆ ์ ๊ณต์ ๊ฐ ์ ๋ขฐ๋ฅผ ์ฆ๋ช
ํ๋ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ์ญํ
๐ธ Access Token ์์ฒญ ์ ์ฌ์ฉ
๐ธ ์๋ฒ์์๋ง ์์ ํ๊ฒ ๋ณด๊ด โ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์๋ ์ ๋ ๋
ธ์ถ๋์ง ์์
๐ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ์ ์ญํ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ โ Authorization Code ๋ฐ๊ธ
- ์๋ฒ๊ฐ Authorization Code + Client Secret์ผ๋ก ํ ํฐ ์์ฒญ
- ๊ตฌ๊ธ์ด Client Secret ๊ฒ์ฆ ํ Access Token ๋ฐ๊ธ
- Authorization Code ํ์ทจ๋๋๋ผ๋ Client Secret ์์ผ๋ฉด ํ ํฐ ๋ฐ๊ธ ๋ถ๊ฐ
๐ฉ PKCE๊ฐ ๊ผญ ํ์ํ ํ๊ฒฝ
- SPA (Single Page Application) โ React, Vue, Angular
- ๋ชจ๋ฐ์ผ ์ฑ โ iOS, Android
- ๋ฐ์คํฌํฑ ์ฑ โ Electron, PWA
๐ Client Secret์ ์์ ํ๊ฒ ์ ์ฅํ ์ ์๋ ํ๊ฒฝ์์๋ PKCE๊ฐ ํ์์
์ฆ,
- SPA, ๋ชจ๋ฐ์ผ, ๋ฐ์คํฌํฑ ์ฑ โ PKCE ํ์!
- ์๋ฒ์ฌ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์
(Spring Boot ๋ฑ) โ PKCE ๋ถํ์ (Client Secret์ด ์๋ฒ์ ์์ ํ๊ฒ ์ ์ฅ๋จ)