์ธ์ฆ Best Case
๊ธฐ๋ณธ flow (OpenIDC)
Best Case๋ผ๊ณ ์๊ฐํ๋ ์ธ์ฆ flow(OpenIDC)๋ฅผ ๋จผ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๋จผ์ , Auth Service๊ฐ ํ ์๋น์ค๊ฐ ์๋ ์์ฌ์ ์๋น์ค์ผ ๋๋ OAuth ๊ธฐ๋ฐ์ flow๊ฐ ํ์์์ด ๋ค์๊ณผ ๊ฐ์ด ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ด ๊ทธ๋ ค์ง๋๋ค. (ํ ์๋น์ค์ผ ๊ฒฝ์ฐ OAuth ๋ณด๊ธฐ)
- Client๊ฐ id(username)์ password๋ฅผ ์ ๋ ฅํ์ฌ ๋ก๊ทธ์ธํฉ๋๋ค. ๋ก๊ทธ์ธ ์์ฒญ์ BFF → Server → Auth Service๋ก ์ ํด์ง๋๋ค.
- ์ ๋ฌ๋ id์ password๋ก Auth Service์์ ์ธ์ฆํฉ๋๋ค.
- ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด
access token
,refresh token
,id token
๋ฅผ Server๋ก ์ ๋ฌํฉ๋๋ค. - Server๋
id token
์ decodeํ์ฌ userInfo๋ฅผ ์ป๊ณ ,id token
์ ๋ฐ๋ก ์ ์ฅํด๋ก๋๋ค. - Server๊ฐ BFF Server์
userInfo
์ token๋ค(access token
,refresh token
)์ ์ ๋ฌํฉ๋๋ค. id token
๊น์ง ๋ด๋ ค์ฃผ์ด BFF Server๊ฐ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ decodeํ์ฌuserInfo
๋ฅผ ๋ด๋ ค์ค ์๋ ์์ต๋๋ค.- BFF Server๊ฐ
refresh token
๋ฅผ ์์ฒด ์ ์ฅํฉ๋๋ค.refresh token
์์ฒด๋ฅผ ๋ด๋ ค์ฃผ๊ณ Client์์ http-only ์ฟ ํค๋ก ์ ์ฅํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.- ๋๋ถ๋ถ User๊ฐ ํ์ ๋์ด์๋ ๋ฐฑ์คํผ์ค์์ ์ด๋ฌํ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
refresh token
์ด ๊ณต๊ฐ ๋์ด ์๋๋ผ๋ ์ฟ ํค๋ฅผ ํตํด ํต์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ Server์ api endpoint๋ฅผ ๋ชจ๋ฅด๋ฉด ๊ณต๊ฒฉํ ์ ์์ต๋๋ค. refresh token
์ด ํ์ทจ๋ ๊น ๊ฑฑ์ ๋๋ค๋ฉด BFF์์ (key : index(or hash value), value :refresh token
)์ธ ์ธ๋ฑ์ค DB์ ํต์ ํ๋ฉด์ key์ ํด๋นํ๋ ๊ฐ์ Client์ ๋ด๋ ค์ค ์ฟ ํค๋ก ์ ์ฅํ๋ฉด ๋ฉ๋๋ค. ์ด์ฐจํผ Client์์๋ ์ธ๋ฑ์ค DB์ ๊ฒฝ๋ก์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์refresh token
์ด ์์ ํฉ๋๋ค.- (์์ flow์์๋ ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ ํฉ๋๋ค.)
- ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ธ๋ฑ์ค DB์์ ํต์ ์ Server์์ ํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
refresh token
์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ง์ด๋ฉฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.- response์ header์ ์ํด
access token
์ด Client์ ์ฟ ํค์ ์ ์ฅ๋ฉ๋๋ค. ๋ํด์userInfo
์refresh key
๊ฐ ํจ๊ป ๋ด๋ ค์ต๋๋ค.access token
์ ์ฟ ํค๋ก ์ ์ฅํ์ง ์๊ณ ๊ทธ๋ฅ ์ ์ฅํ ํ, Request Header์ ์ง์ Authorization ์์ฑ์ผ๋ก ๋ด์ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
- Client์์
access token
์ด ๋ด๊ธด cookie๋ฅผ ํฌํจํด์ api ์์ฒญ์ ๋ณด๋ ๋๋ค. ์์ฒญ์ BFF → Server๋ฅผ ๊ฑฐ์นฉ๋๋ค. - Server์์ Auth Service์ ํด๋น
access token
์ด ์ ํจํ ์ง ๊ฒ์ฆ์ ์์ฒญํฉ๋๋ค. - Auth Service์์ ๊ฒ์ฆ ํ (
access token
์ด ์ด์ํ ๊ฐ ์ด๊ฑฐ๋ ์ ํจ๊ธฐ๊ฐ์ด ์ง๋ ๋ฑ์ ์ด์ ๋ก) ์คํจ๊ฐ ๋์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. Auth Service → Server → BFF Server → Client ๋ก ๊ฒ์ฆ ์คํจ๋ฅผ ๋ด๋ ค์ค๋๋ค. - Client๋ ์ธ์ฆ ์คํจ๋ฅผ ํ์ธํ ํ BFF์ ๋ณด์ ํ๊ณ ์๋
refresh key
์ ํจ๊ปaccess token
์ฌ๋ฐ๊ธ ์์ฒญ์ ๋ณด๋ ๋๋ค. ํด๋น ์์ฒญ์ BFF์์ ์ธ๋ฑ์ค DB์ ์ํดrefresh token
์ผ๋ก ๋ณ๊ฒฝ๋์ด Server๋ฅผ ๊ฑฐ์ณ Auth Service๋ก ์ ๋ฌ๋ฉ๋๋ค.- ๋ง์ผ Client์ http-only ์ฟ ํค๋ก ๋์ด์จ๋ค๋ฉด ๋ค๋ฅธ ๊ณผ์ ์์ด ๋ฐ๋ก ์์ฒญ์ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
- BFF Server์์ ์ธ๋ฑ์ค DB์ ํต์ ํ๋ค๋ฉด ์ ๋ฌ ๋ฐ์
refresh key
๋ฅผ ์ด์ฉํดrefresh token
์ ์ฐพ์ Server์ ์ ๋ฌํฉ๋๋ค. - Server์์ ์ธ๋ฑ์ค DB์ ํต์ ํ๋ค๋ฉด
refresh key
๋ฅผ Server์ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
- Auth Service์์
refresh token
์ ๊ฒ์ฆ์ ๊ฑฐ์นฉ๋๋ค. - ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด Auth Service์์ Server๋ก
access token
์ ์ ๋ฌํฉ๋๋ค. - Server์์ BFF Server๋ก
access token
๊ณผuserInfo
๋ฅผ ์ ๋ฌํฉ๋๋ค. - BFF Server๋ Client์
userInfo
์access token
์ ๋ด๋ ค์ค๋๋ค. - Client๋ api ์์ฒญ์
access token
์ด ์๋ cookie์ ํจ๊ป ๋ณด๋ ๋๋ค. ์์ฒญ์ BFF Server๋ฅผ ๊ฑฐ์ณ Server๋ก ๊ฐ๋๋ค. - Server์์๋ Auth Service์
access token
์ ๋ํ ๊ฒ์ฆ ์์ฒญ์ ํฉ๋๋ค. - Auth Service์์ ์ธ์ฆ ์ฑ๊ณต์ด ๋ด๋ ค์ค๋ฉด response๊ฐ Client์๊น์ง ๋ด๋ ค๊ฐ๋๋ค.
์ธ์ฆ ๋ฐ ์ธ๊ฐ
OpenIDC ์์๋ access token
์ผ๋ก ์ธ์ฆ(ํน์ User์์ ์ฆ๋ช
)ํ๊ณ , id token
์ผ๋ก ์ธ๊ฐ(์ด๋ค ๊ถํ์ด ์๋์ง๋ฅผ ํ์ธ)ํฉ๋๋ค.
ํ ํฐ ๊ธฐ๋ฐ์ ์ธ์ฆ
์์ฒ๋ผ ํ ํฐ์ ์ด์ฉํ์ฌ ์ธ์ฆํ๋ flow๋ฅผ ํ ํฐ ๊ธฐ๋ฐ์ ์ธ์ฆ์ด๋ผ ์ผ์ปซ์ต๋๋ค.
ํ ํฐ์ ๋ค์์ 3๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
access token
: ์ฌ์ฉ์ ์ธ์ฆ ๋ชฉ์ refresh token
: access token ์ฌ๋ฐ๊ธ ๋ชฉ์ id token
: ์ ๋ณด ์ ๋ฌ์ ๋ชฉ์
access token
์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ฉฐ ์ฟ ํค์ ์ฃผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ํ์ทจ ์ ๋น ๋ฅด๊ฒ ๋ฌดํจํํ ์ ์๋๋ก ์ ํจ์๊ฐ์ ์งง๊ฒ ์ค์ ํฉ๋๋ค. ๋์ refresh token
์ ์ด์ฉํ์ฌ access token
์ ๋ฌดํ์ ์ฌ๋ฐ๊ธ ํ ์ ์์ผ๋ฏ๋ก refresh token
์ด ํ์ทจ๋๋ฉด ์ํํฉ๋๋ค.
refresh token์ ์ ์ฅ ๋ฐฉ๋ฒ
๋ฐ๋ผ์, 6๋ฒ ๊ณผ์ ์์ ๋ณด์๋ฏ์ด refresh token
์ด ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
refresh token
์์ฒด๋ฅผ Client์์ http-only ์ฟ ํค๋ก ์ ์ฅ- BFF์์ (key : index(or hash value), value :
refresh token
)์ธ ์ธ๋ฑ์ค DB์ ํต์ ํ๋ฉด์ key์ ํด๋นํ๋ ๊ฐ์ Client์ ๋ด๋ ค์ค ์ฟ ํค๋ก ์ ์ฅ - 2์ ๊ฐ์ ๋ฐฉ์์ด์ง๋ง ์ธ๋ฑ์ค DB์์ ํต์ ์ Server์์
JWT
ํ ํฐ์ ์ฃผ๋ก JWT ๋ฐฉ์์ผ๋ก ๋ณํ๋์ด Client์ ์ ์ฅ๋ฉ๋๋ค.
JWT๋ JSON ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋ฐฉ์์ ๋๋ค. JWT๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ถ๊ธฐ ์ํด์๊ฐ ์๋๋ผ, ๋ฐ์ดํฐ๊ฐ ๋ฐ๋์ง ์๊ณ ์ ์ฆ๋ ์ฌ์ฉ์์ ์ํด ๋ณด๋ด์ก์ ์ ์ฆ๋ช ํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. JWT๋ฅผ ์ด์ฉํ๋ฉด User๋ฅผ ์๋ฒ session์ ์ ์ฅํ์ง ์๊ณ ๋(User๋ง๋ค Session์ ์ ์งํ์ง ์๊ณ ๋) ํด๋น User๊ฐ ์ ํฉํ ์ง ์ธ์ฆ ๊ฐ๋ฅํฉ๋๋ค.
JWT๋ 3๊ฐ์ ํํธ๋ก ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
header.payload.signature
- Header : JWT๋ผ๋ type๊ณผ ์ฌ์ฉํ๋ ํด์ ํจ์ ์๊ณ ๋ฆฌ์ฆ์ด ๊ธฐ์ฌ๋์ด ์์ต๋๋ค.
- Payload : ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ผ๋ฉฐ, ์ ํ์ ์ผ๋ก expire time ๋ฑ์ด ๋ค์ด์์ต๋๋ค. ๋น ๋ฅธ request ์ฒ๋ฆฌ๋ฅผ ์ํด ์งง๊ฒ ๊ตฌ์ฑ๋์ด์์ผ๋ฉฐ, ์ฝ๊ฒ decode ๋ ์ ์์ผ๋ฏ๋ก ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ฃ์ผ๋ฉด ์๋ฉ๋๋ค.
- Signature : header์ payload ๋ฐ์ดํฐ์ ํฉ์ ๋๋ค. JWT ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์ค์ํ ํํธ๋ก ์ฝ๊ฒ decode ๋์ง ์์ต๋๋ค. header์ payload๊ฐ ๋ฐ๋์ง ์์๋ ์ง ์ฒดํฌํ๊ณ private key๋ฅผ ์ด์ค ์ฒดํฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Comment