๐ JWT ํ ํฐ ์ธ์ฆ ์ด๋? (์ฟ ํค vs ์ธ์ vs ํ ํฐ)
Cookie / Session / Token ์ธ์ฆ ๋ฐฉ์ ์ข ๋ฅ
๋ณดํต ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ํ์ธํ๋ ๋ฐฉ์์ ๋ํ์ ์ผ๋ก ์ฟ ํค, ์ธ์ , ํ ํฐ 3๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
JWT๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์์ ์ฐ์ ์ฟ ํค์ ์ธ์ ์ ํต์ ๋ฐฉ์์ ๋ณต์ตํด๋ณด๊ณ ์ด๋ค์ ๊ฐ๊ฐ ํน์ง๊ณผ ์ฅ๋จ์ ๊ทธ๋ฆฌ๊ณ ์ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ์ง๋์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ณด์. (์ฃผ์ ์ ์๊ธฐํ์ง๋ง๊ณ ๊ณผ์ ์ ์ดํดํ๋ฉด ๋จธ๋ฆฟ์์ ๋ ์ค๋ ๋จ์ ๊ฒ์ด๋ค!)
Cookie ์ธ์ฆ
์ฟ ํค๋ Key-Value ํ์์ ๋ฌธ์์ด ๋ฉ์ด๋ฆฌ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ํ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ, ๊ทธ ์ฌ์ดํธ๊ฐ ์ฌ์ฉํ๊ณ ์๋ ์๋ฒ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์ ์ค์น๋๋ ์์ ๊ธฐ๋ก ์ ๋ณด ํ์ผ์ด๋ค. ๊ฐ ์ฌ์ฉ์๋ง๋ค์ ๋ธ๋ผ์ฐ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ณ ์ ์ ๋ณด ์๋ณ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
Cookie ์ธ์ฆ ๋ฐฉ์
- ๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)๊ฐ ์๋ฒ์ ์์ฒญ(์ ์)์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต์ ์์ฑํ ๋, ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ๊ณ ์ถ์ ์ ๋ณด๋ฅผ ์๋ต ํค๋์ Set-Cookie์ ๋ด๋๋ค.
- ์ดํ ํด๋น ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค, ๋งค๋ฒ ์ ์ฅ๋ ์ฟ ํค๋ฅผ ์์ฒญ ํค๋์ Cookie์ ๋ด์ ๋ณด๋ธ๋ค.
์๋ฒ๋ ์ฟ ํค์ ๋ด๊ธด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํด๋น ์์ฒญ์ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฐ์ง ์๋ณํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ถ์ฒ ๊ด๊ณ ๋ฅผ ๋์ฐ๊ฑฐ๋ ํ๋ค.
Cookie ๋ฐฉ์์ ๋จ์
- ๊ฐ์ฅ ํฐ ๋จ์ ์ ๋ณด์์ ์ทจ์ฝํ๋ค๋ ์ ์ด๋ค.
์์ฒญ ์ ์ฟ ํค์ ๊ฐ์ ๊ทธ๋๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ์ ์ถ ๋ฐ ์กฐ์ ๋นํ ์ํ์ด ์กด์ฌํ๋ค. - ์ฟ ํค์๋ ์ฉ๋ ์ ํ์ด ์์ด ๋ง์ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฟ ํค์ ๋ํ ์ง์ ํํ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ฟ ํค์ ์ฌ์ด์ฆ๊ฐ ์ปค์ง์๋ก ๋คํธ์ํฌ์ ๋ถํ๊ฐ ์ฌํด์ง๋ค.
Session ์ธ์ฆ
์ด๋ฌํ ์ฟ ํค์ ๋ณด์์ ์ธ ์ด์ ๋๋ฌธ์, ์ธ์ ์ ๋น๋ฐ๋ฒํธ ๋ฑ ํด๋ผ์ด์ธํธ์ ๋ฏผ๊ฐํ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์๋ฒ ์ธก์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ค. ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ธฐ๋ ํ๊ณ , ์๋ฒ์ ๋ก์ปฌ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ธฐ๋ ํ๋ค.
ํต์ฌ ๊ณจ์๋ ๋ฏผ๊ฐํ ์ ๋ณด๋ ํด๋ผ์ด์ธํธ์ ๋ณด๋ด์ง๋ง๊ณ ์๋ฒ์์ ๋ชจ๋ ๊ด๋ฆฌํ๋ค๋ ์ ์ด๋ค.
์ธ์ ๊ฐ์ฒด๋ ์ด๋ค ํํ๋ก ์ด๋ฃจ์ด์ ธ ์์๊น ?
์ธ์ ๊ฐ์ฒด๋ Key์ ํด๋นํ๋ SESSION ID์ ์ด์ ๋์ํ๋ Value๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
Value์๋ ์ธ์ ์์ฑ ์๊ฐ, ๋ง์ง๋ง ์ ๊ทผ ์๊ฐ ๋ฐ User๊ฐ ์ ์ฅํ ์์ฑ ๋ฑ ์ด Map ํํ๋ก ์ ์ฅ๋๋ค.
Session ์ธ์ฆ ๋ฐฉ์
- ์ ์ ๊ฐ ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธํ๋ฉด ์ธ์
์ด ์๋ฒ ๋ฉ๋ชจ๋ฆฌ(ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค) ์์ ์ ์ฅ๋๋ค.
์ด๋, ์ธ์ ์ ์๋ณํ๊ธฐ ์ํ Session Id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค. - ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์๋ค๊ฐ Session Id๋ฅผ ์ ์ฅํ๋ค.
- ์ฟ ํค์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฌ์ดํธ์ ๋ํ ๋ชจ๋ Request์ Session Id๋ฅผ ์ฟ ํค์ ๋ด์ ์ ์กํ๋ค.
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ Session Id ์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ด๋ฆฌํ๊ณ ์๋ Session Id๋ฅผ ๋น๊ตํ์ฌ ์ธ์ฆ์ ์ํํ๋ค.
Session ๋ฐฉ์์ ๋จ์
- ์ฟ ํค๋ฅผ ํฌํจํ ์์ฒญ์ด ์ธ๋ถ์ ๋
ธ์ถ๋๋๋ผ๋ ์ธ์
ID ์์ฒด๋ ์ ์๋ฏธํ ๊ฐ์ธ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ง ์๋๋ค.
๊ทธ๋ฌ๋ ํด์ปค๊ฐ ์ธ์ ID ์์ฒด๋ฅผ ํ์ทจํ์ฌ ํด๋ผ์ด์ธํธ์ธ์ฒ ์์ฅํ ์ ์๋ค๋ ํ๊ณ๊ฐ ์กด์ฌํ๋ค. (์ด๋ ์๋ฒ์์ IPํน์ ์ ํตํด ํด๊ฒฐ ํ ์ ์๊ธด ํ๋ค) - ์๋ฒ์์ ์ธ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์์ฒญ์ด ๋ง์์ง๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ์ฌํด์ง๋ค.
Token ์ธ์ฆ
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์์ ํ๋ฉด ์๋ฒ์์ ํด๋น ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ๋์๋ค๋ ์๋ฏธ๋ก 'ํ ํฐ'์ ๋ถ์ฌํ๋ค. ์ด ํ ํฐ์ ์ ์ผํ๋ฉฐ ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ ํด๋ผ์ด์ธํธ๋ ๋ ๋ค์ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ์์ฒญ ํค๋์ ํ ํฐ์ ์ฌ์ด์ ๋ณด๋ธ๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฒ์์๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ํ ํฐ์ ์๋ฒ์์ ์ ๊ณตํ ํ ํฐ๊ณผ์ ์ผ์น ์ฌ๋ถ๋ฅผ ์ฒดํฌํ์ฌ ์ธ์ฆ ๊ณผ์ ์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๊ธฐ์กด์ ์ธ์ ๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ๊ฐ ํ์ผ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๊ณ ์ด๋ฅผ ์กฐํํ๋ ๊ณผ์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง ํ ํฐ์ ์ธ์ ๊ณผ๋ ๋ฌ๋ฆฌ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ์คํ ๋ฆฌ์ง ๋ฑ์ ํตํด ์ธ์ ์ ๊ด๋ฆฌํ๋ ์๋ฒ์ ๋ถ๋ด์ ๋ ์ ์๋ค. ํ ํฐ ์์ฒด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ ์์กฐ๋์๋์ง ํ๋ณ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ ํฐ์ ์ฑ๊ณผ ์๋ฒ๊ฐ ํต์ ๋ฐ ์ธ์ฆํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ค. ์๋ํ๋ฉด ์น์๋ ์ฟ ํค์ ์ธ์ ์ด ์์ง๋ง ์ฑ์์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
[์๋ฒ ๊ธฐ๋ฐ vs ํ ํฐ ๊ธฐ๋ฐ]
์๋ฒ(์ธ์ ) ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์๋ฒ์ ์ธ์ ์ ์ฌ์ฉํด ์ฌ์ฉ์ ์ธ์ฆ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์๋ฒ์ธก(์๋ฒ ๋จ or ๋ฐ์ดํฐ๋ฒ ์ด์ค)์์ ์ฌ์ฉ์์ ์ธ์ฆ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ฌ๋ค ๋ณด๋, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ๊ณ์์์ ์ ์งํด๋๊ณ ์ฌ์ฉํ๋ค.
(Stateful) ์ด๋ ์ฌ์ฉ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฑ๋ฅ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฉฐ ํ์ฅ์ฑ์ด ์ด๋ ต๋ค๋ ๋จ์ ์ ์ง๋๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ด๋ฌํ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด์ "ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ "์ด ๋ํ๋ฌ๋ค.
์ธ์ฆ๋ฐ์ ์ฌ์ฉ์์๊ฒ ํ ํฐ์ ๋ฐ๊ธํ๊ณ , ๋ก๊ทธ์ธ์ด ํ์ํ ์์ ์ผ ๊ฒฝ์ฐ ํค๋์ ํ ํฐ์ ํจ๊ป ๋ณด๋ด ์ธ์ฆ๋ฐ์ ์ฌ์ฉ์์ธ์ง ํ์ธํ๋ค.
์ด๋ ์๋ฒ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ ๊ณผ ๋ฌ๋ฆฌ ์ํ๋ฅผ ์ ์งํ์ง ์์ผ๋ฏ๋ก Stateless ํ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
Token ์ธ์ฆ ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ์ ํ๋ค.
- ์๋ฒ ์ธก์์ ์ฌ์ฉ์(ํด๋ผ์ด์ธํธ)์๊ฒ ์ ์ผํ ํ ํฐ์ ๋ฐ๊ธํ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ ์ธก์์ ์ ๋ฌ๋ฐ์ ํ ํฐ์ ์ฟ ํค๋ ์คํ ๋ฆฌ์ง์ ์ ์ฅํด ๋๊ณ , ์๋ฒ์ ์์ฒญ์ ํ ๋๋ง๋ค ํด๋น ํ ํฐ์ ์HTTP ์์ฒญ ํค๋์ ํฌํจ์์ผ ์ ๋ฌํ๋ค.
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์๋ตํ๋ค.
ํ ํฐ์๋ ์์ฒญํ ์ฌ๋์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ธฐ์ ์๋ฒ๋ DB๋ฅผ ์กฐํํ์ง ์๊ณ ๋๊ฐ ์์ฒญํ๋์ง ์ ์ ์๋ค.
Token ๋ฐฉ์์ ๋จ์
- ์ฟ ํค/์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ ํ ํฐ ์์ฒด์ ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ ๊ธธ์ด, ์ธ์ฆ ์์ฒญ์ด ๋ง์์ง์๋ก ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฌํด์ง์ ์๋ค.
- Payload ์์ฒด๋ ์ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ค์ํ ์ ๋ณด๋ ๋ด์ ์ ์๋ค.
- ํ ํฐ์ ํ์ทจ๋นํ๋ฉด ๋์ฒํ๊ธฐ ์ด๋ ต๋ค. (๋ฐ๋ผ์ ์ฌ์ฉ ๊ธฐ๊ฐ ์ ํ์ ์ค์ ํ๋ ์์ผ๋ก ๊ทน๋ณตํ๋ค)
JWT (JSON Web Token) ์ด๋
JWT(JSON Web Token)๋ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ JSON ํ ํฐ์ ์๋ฏธํ๋ค. ๊ทธ๋ฆฌ๊ณ JWT ๊ธฐ๋ฐ ์ธ์ฆ์ JWT ํ ํฐ(Access Token)์ HTTP ํค๋์ ์ค์ด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐฉ์์ด๋ค
JWT๋ JSON ๋ฐ์ดํฐ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํตํด ์ธ์ฝ๋ฉํ์ฌ ์ง๋ ฌํํ ๊ฒ์ด๋ฉฐ, ํ ํฐ ๋ด๋ถ์๋ ์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํด ๊ฐ์ธํค๋ฅผ ํตํ ์ ์์๋ช ๋ ๋ค์ด์๋ค. ๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ JWT ๋ฅผ ์๋ฒ๋ก ์ ์กํ๋ฉด ์๋ฒ๋ ์๋ช ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ฉฐ ๊ฒ์ฆ์ด ์๋ฃ๋๋ฉด ์์ฒญํ ์๋ต์ ๋๋ ค์ค๋ค.
Base64 URL-safe Encode ๋ ์ผ๋ฐ์ ์ธ Base64 Encode ์์ URL ์์ ์ค๋ฅ์์ด ์ฌ์ฉํ๋๋ก '+', '/' ๋ฅผ ๊ฐ๊ฐ '-', '_' ๋ก ํํํ ๊ฒ์ด๋ค.
JWT ๊ตฌ์กฐ
JWT๋ . ์ ๊ตฌ๋ถ์๋ก ๋๋์ด์ง๋ ์ธ ๊ฐ์ง ๋ฌธ์์ด์ ์กฐํฉ์ด๋ค.
. ์ ๊ธฐ์ค์ผ๋ก ์ข์ธก๋ถํฐ Header, Payload, Signature๋ฅผ ์๋ฏธํ๋ค.
Header ์๋ JWT ์์ ์ฌ์ฉํ ํ์ ๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ๋ฅ๊ฐ ๋ด๊ฒจ์์ผ๋ฉฐ, Payload ๋ ์๋ฒ์์ ์ฒจ๋ถํ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋ค. ๋ง์ง๋ง์ผ๋ก Signature ์๋ Header, Payload ๋ฅผ Base64 URL-safe Encode ๋ฅผ ํ ์ดํ Header ์ ๋ช ์๋ ํด์ํจ์๋ฅผ ์ ์ฉํ๊ณ , ๊ฐ์ธํค(Private Key)๋ก ์๋ช ํ ์ ์์๋ช ์ด ๋ด๊ฒจ์๋ค.
์ค์ ๋์ฝ๋ฉ๋ JWT๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ง๋๋ค.
Header
- alg : ์๋ช ์ํธํ ์๊ณ ๋ฆฌ์ฆ(ex: HMAC SHA256, RSA)
- typ : ํ ํฐ ์ ํ
Payload
ํ ํฐ์์ ์ฌ์ฉํ ์ ๋ณด์ ์กฐ๊ฐ๋ค์ธ Claim ์ด ๋ด๊ฒจ์๋ค. (์ค์ JWT ๋ฅผ ํตํด์ ์ ์ ์๋ ๋ฐ์ดํฐ)
์ฆ, ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ์์คํ ์์ ์ค์ ๋ก ์ฌ์ฉ๋ ์ ๋ณด์ ๋ํ ๋ด์ฉ์ ๋ด๊ณ ์๋ ์น์ ์ด๋ค.
key-value ํ์์ผ๋ก ์ด๋ฃจ์ด์ง ํ ์์ ์ ๋ณด๋ฅผ Claim์ด๋ผ๊ณ ์นญํ๋ค.
ํ์ด๋ก๋๋ ์ ํด์ง ๋ฐ์ดํฐ ํ์ ์ ์์ง๋ง, ๋ํ์ ์ผ๋ก Registered claims, Public claims, Private claims ์ด๋ ๊ฒ ์ธ ๊ฐ์ง๋ก ๋๋๋ค.
- Registed claims : ๋ฏธ๋ฆฌ ์ ์๋ ํด๋ ์.
- iss(issuer; ๋ฐํ์),
- exp(expireation time; ๋ง๋ฃ ์๊ฐ),
- sub(subject; ์ ๋ชฉ),
- iat(issued At; ๋ฐํ ์๊ฐ),
- jti(JWI ID)
- iss(issuer; ๋ฐํ์),
- Public claims : ์ฌ์ฉ์๊ฐ ์ ์ํ ์ ์๋ ํด๋ ์ ๊ณต๊ฐ์ฉ ์ ๋ณด ์ ๋ฌ์ ์ํด ์ฌ์ฉ.
- Private claims : ํด๋นํ๋ ๋น์ฌ์๋ค ๊ฐ์ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์ฌ์ฉ์ ์ง์ ํด๋ ์. ์ธ๋ถ์ ๊ณต๊ฐ๋๋ ์๊ด์์ง๋ง ํด๋น ์ ์ ๋ฅผ ํน์ ํ ์ ์๋ ์ ๋ณด๋ค์ ๋ด๋๋ค
Signature
์๊ทธ๋์ฒ์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ํค๋์์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์(alg)์ ํ์ฉํ๋ค.
์๊ทธ๋์ฒ์ ๊ตฌ์กฐ๋ (ํค๋ + ํ์ด๋ก๋)์ ์๋ฒ๊ฐ ๊ฐ๊ณ ์๋ ์ ์ผํ key ๊ฐ์ ํฉ์น ๊ฒ์ ํค๋์์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํ๋ฅผ ํ๋ค.
Header์ Payload๋ ๋จ์ํ ์ธ์ฝ๋ฉ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ 3์๊ฐ ๋ณตํธํ ๋ฐ ์กฐ์ํ ์ ์์ง๋ง, Signature๋ ์๋ฒ ์ธก์์ ๊ด๋ฆฌํ๋ ๋น๋ฐํค๊ฐ ์ ์ถ๋์ง ์๋ ์ด์ ๋ณตํธํํ ์ ์๋ค. ๋ฐ๋ผ์ Signature๋ ํ ํฐ์ ์๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๋๋ฐ ์ฌ์ฉ๋๋ค.
JWT ์ธ์ฝ๋ฉ / ๋์ฝ๋ฉ ํด๋ณด๊ธฐ
์ง์ JWT ํ ํฐ์ ์์ฑํด ์ฐ์ตํด๋ณด๊ณ ์ถ๋ค๋ฉด, ์๋ ๊ณต์์ฌ์ดํธ์์ ์ฝ๊ฒ JWT ํ ํฐ์ ์ธ์ฝ๋ฉ(์์ฑ) ํ๊ฑฐ๋ ๋์ฝ๋ฉ ํ ์ ์๋ค.
JWT๋ฅผ ์ด์ฉํ ์ธ์ฆ ๊ณผ์
- ์ฌ์ฉ์๊ฐ ID, PW๋ฅผ ์ ๋ ฅํ์ฌ ์๋ฒ์ ๋ก๊ทธ์ธ ์ธ์ฆ์ ์์ฒญํ๋ค.
- ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ธ์ฆ ์์ฒญ์ ๋ฐ์ผ๋ฉด, Header, PayLoad, Signature๋ฅผ ์ ์ํ๋ค.
Hedaer, PayLoad, Signature๋ฅผ ๊ฐ๊ฐ Base64๋ก ํ ๋ฒ ๋ ์ํธํํ์ฌ JWT๋ฅผ ์์ฑํ๊ณ ์ด๋ฅผ ์ฟ ํค์ ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ๊ธํ๋ค. - ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ค. (์ฟ ํค๋ ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํ ์๋ ์์)
API๋ฅผ ์๋ฒ์ ์์ฒญํ ๋ Authorization header์ Access Token์ ๋ด์์ ๋ณด๋ธ๋ค. - ์๋ฒ๊ฐ ํ ์ผ์ ํด๋ผ์ด์ธํธ๊ฐ Header์ ๋ด์์ ๋ณด๋ธ JWT๊ฐ ๋ด ์๋ฒ์์ ๋ฐํํ ํ ํฐ์ธ์ง ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ์ผ์นํ๋ค๋ฉด ์ธ์ฆ์ ํต๊ณผ์์ผ์ฃผ๊ณ ์๋๋ผ๋ฉด ํต๊ณผ์ํค์ง ์์ผ๋ฉด ๋๋ค.
์ธ์ฆ์ด ํต๊ณผ๋์์ผ๋ฏ๋ก ํ์ด๋ก๋์ ๋ค์ด์๋ ์ ์ ์ ์ ๋ณด๋ค์ selectํด์ ํด๋ผ์ด์ธํธ์ ๋๋ ค์ค๋ค. - ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ํ๋๋ฐ, ๋ง์ผ ์ก์ธ์ค ํ ํฐ์ ์๊ฐ์ด ๋ง๋ฃ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฆฌํ๋์ ํ ํฐ์ ์ด์ฉํด์
- ์๋ฒ๋ก๋ถํฐ ์๋ก์ด ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ ๋ฐ๋๋ค.
ํ ํฐ ์ธ์ฆ ์ ๋ขฐ์ฑ์ ๊ฐ์ง๋ ์ด์
์ ์ JWT: A(Header) + B(Payload) + C(Signature) ์ผ ๋ (๋ง์ผ ์์์ ์ ์ ๊ฐ B๋ฅผ ์์ ํ๋ค๊ณ ํ๋ฉด B'๋ก ํ์ํ๋ค.)
- ๋ค๋ฅธ ์ ์ ๊ฐ B๋ฅผ ์์๋ก ์์ -> ์ ์ JWT: A + B' + C
- ์์ ํ ํ ํฐ์ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฒ๋ ์ ํจ์ฑ ๊ฒ์ฌ ์ํ
- ์ ์ JWT: A + B' + C
- ์๋ฒ์์ ๊ฒ์ฆ ํ ์์ฑํ JWT: A + B' + C' => (signature) ๋ถ์ผ์น
- ๋์กฐ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ์ง ์์ ์ ์ ์ ์ ๋ณด๊ฐ ์์๋ก ์กฐ์๋์์์ ์ ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด, ์๋ฒ๋ ํ ํฐ ์์ ๋ค์ด์๋ ์ ๋ณด๊ฐ ๋ฌด์์ธ์ง ์๋๊ฒ ์ค์ํ ๊ฒ์ด ์๋๋ผ ํด๋น ํ ํฐ์ด ์ ํจํ ํ ํฐ์ธ์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ JWT์ ํค๋, ํ์ด๋ก๋๋ฅผ ์๋ฒ์ key๊ฐ์ ์ด์ฉํด ์๊ทธ๋์ฒ๋ฅผ ๋ค์ ๋ง๋ค๊ณ ์ด๋ฅผ ๋น๊ตํ๋ฉฐ ์ผ์นํ์ ๊ฒฝ์ฐ ์ธ์ฆ์ ํต๊ณผ์ํจ๋ค.
๐ก JWT์ ์๋ช (์ธ์ฆ)์ด ๋ชฉ์ ์ด๋ค.
JWT๋ Base64๋ก ์ํธํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํด์ ์ธ์ฝ๋ฉ๋ JWT๋ฅผ 1์ด๋ง์ ๋ณตํธํํ ์ ์๋ค.
๋ณตํธํ ํ๋ฉด ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ Payload ๋ถ๋ถ์ด ๊ทธ๋๋ก ๋ ธ์ถ๋์ด ๋ฒ๋ฆฐ๋ค. ๊ทธ๋์ ํ์ด๋ก๋์๋ ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ฃ์ง ๋ง์์ผ ํ๋ค.
๊ทธ๋ผ ํ ํฐ ์ธ์ฆ ๋ฐฉ์ ์์ฒด๊ฐ ๋น ์ข์ ๊ฐ์ด๊ตฌ๋ผ๊ณ ์๊ฐํ ์๋ ์์ง๋ง, ํ ํฐ์ ์ง์ง ๋ชฉ์ ์ ์ ๋ณด ๋ณดํธ๊ฐ ์๋, ์์กฐ ๋ฐฉ์ง์ด๋ค.
๋ฐ๋ก ์์์ ์๊ฐํ๋ฏ์ด, ์๊ทธ๋์ฒ์ ์ฌ์ฉ๋ ๋น๋ฐํค๊ฐ ๋ ธ์ถ๋์ง ์๋์ด์ ๋ฐ์ดํฐ๋ฅผ ์์กฐํด๋ ์๊ทธ๋์ฒ ๋ถ๋ถ์์ ๋ฐ๋ก ๊ฑธ๋ฌ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
JWT ์ฅ๋จ์ ์ ๋ฆฌ
JWT ์ฅ์
- Header์ Payload๋ฅผ ๊ฐ์ง๊ณ Signature๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์๋ค.
- ์ธ์ฆ ์ ๋ณด์ ๋ํ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์์๋ค.
- JWT๋ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด์ ์ ๋ฌํ ์ ๋ณด ๋ฐ ํ ํฐ์ด ๊ฒ์ฆ๋ฌ์์ ์ฆ๋ช ํ๋ ์๋ช ๋ฑ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์๋ค.
- ํด๋ผ์ด์ธํธ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ, ์๋ฒ๋ ๋ฌด์ํ(StateLess)๊ฐ ๋์ด ์๋ฒ ํ์ฅ์ฑ์ด ์ฐ์ํด์ง ์ ์๋ค.
- ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ๋ก๊ทธ์ธ ์์คํ ์ ์ ๊ทผ ๋ฐ ๊ถํ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค. (์ฟ ํค์ ์ฐจ์ด)
- OAuth์ ๊ฒฝ์ฐ Facebook, Google ๋ฑ ์์ ๊ณ์ ์ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์น์๋น์ค์์๋ ๋ก๊ทธ์ธ์ ํ ์ ์๋ค.
- ๋ชจ๋ฐ์ผ ์ดํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์๋ ์ ๋์ํ๋ค. (๋ชจ๋ฐ์ผ์ ์ธ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ)
์๋ฒ์์ ๊ฐ์ฅ ํผํด์ผ ํ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ์ด๋ค.
์๋ฒ ์์ฒด๊ฐ ์ฃฝ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, ๋๋ถ๋ถ DB๊ฐ ํฐ์ ธ์ ์๋ฒ๋ ๊ฐ์ด ์ฃฝ๋ ๊ฒฝ์ฐ๊ฐ ํ๋คํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ ์ ์์, JWT ํ ํฐ์ DB์กฐํ๋ฅผ ์ํด๋ ๋๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ด๋ค.
๋ง์ผ payload์ ์ ์ ์ด๋ฆ๊ณผ ์ ์ ๋ฑ๊ธ ์ ๊ฐ์ด ๋๊ณ ๋ณด๋ด๋ฉด, ์๋ฒ์์๋ ์ ์ ์ด๋ฆ์ ๊ฐ์ง๊ณ DB๋ฅผ ์กฐํํด์ ์ ์ ๋ฑ๊ธ์ ์ป์ง์์๋ ๋ฐ๋ก ์ํ๋ ์ ๋ณด๋ฅผ ์ทจํ ์ ์๋ค.
JWT ๋จ์
- Self-contained : ํ ํฐ ์์ฒด์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก ์๋ ์ ๊ฒ์ด ๋ ์ ์๋ค.
- ํ ํฐ ๊ธธ์ด : ํ ํฐ์ Payload์ 3์ข ๋ฅ์ ํด๋ ์์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์, ์ ๋ณด๊ฐ ๋ง์์ง์๋ก ํ ํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋ ๋คํธ์ํฌ์ ๋ถํ๋ฅผ ์ค ์ ์๋ค.
- Payload ์ธ์ฝ๋ฉ : payload ์์ฒด๋ ์ํธํ ๋ ๊ฒ์ด ์๋๋ผ BASE64๋ก ์ธ์ฝ๋ฉ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ค๊ฐ์ Payload๋ฅผ ํ์ทจํ์ฌ ๋์ฝ๋ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์์ผ๋ฏ๋ก, payload์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์์์ผ ํ๋ค.
- Store Token : stateless ํน์ง์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ด๋ฆฌํ๊ณ ์ ์ฅํ๋ค. ๋๋ฌธ์ ํ ํฐ ์์ฒด๋ฅผ ํ์ทจ๋นํ๋ฉด ๋์ฒํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ๋๋ค.
JWT์ Access Token / Refresh Token
๋ค๋ง ์ด JWT๋ ์ 3์์๊ฒ ํ ํฐ ํ์ทจ์ ์ํ์ฑ์ด ์๊ธฐ ๋๋ฌธ์, ๊ทธ๋๋ก ์ฌ์ฉํ๋๊ฒ์ด ์๋ Access Token, Refresh Token ์ผ๋ก ์ด์ค์ผ๋ก ๋๋์ด ์ธ์ฆ์ ํ๋ ๋ฐฉ์์ ํ์ ์์ ์ทจํ๋ค.
Access Token ๊ณผ Refresh Token์ ๋๋ค ๋๊ฐ์ JWT์ด๋ค. ๋ค๋ง ํ ํฐ์ด ์ด๋์ ์ ์ฅ๋๊ณ ๊ด๋ฆฌ๋๋๋์ ๋ฐ๋ฅธ ์ฌ์ฉ ์ฐจ์ด์ผ ๋ฟ์ด๋ค.
- Access Token : ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ณ ์๋ ์ค์ ๋ก ์ ์ ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ํฐ์ผ๋ก, ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ด ์ค๋ฉด ์๋ฒ์์ ํด๋น ํ ํฐ์ ์๋ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด์ ๋ง๊ฒ ์๋ต์ ์งํ
- Refresh Token: ์๋ก์ด Access Token์ ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์ผ๋ก ์งง์ ์๋ช ์ ๊ฐ์ง๋ Access Token์๊ฒ ์๋ก์ด ํ ํฐ์ ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ. ํด๋น ํ ํฐ์ ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ์ ๋ณด์ ๊ฐ์ด ๊ธฐ๋ก.
์ ๋ฆฌํ์๋ฉด, Access Token์ ์ ๊ทผ์ ๊ด์ฌํ๋ ํ ํฐ, Refresh Token์ ์ฌ๋ฐ๊ธ์ ๊ด์ฌํ๋ ํ ํฐ์ ์ญํ ๋ก ์ฌ์ฉ๋๋ JWT ์ด๋ผ๊ณ ๋งํ ์ ์๋ค.
์์์๋ ๋งํ๋ฏ์ด JWT ์ธ์ฆ ๋ฐฉ์์ ๋ง์ฝ Access Token ๋ง์ ์ด์ฉํ๋ฉด, Access Token์ ๋ฐ๊ธ๋ ์ดํ ์๋ฒ์ ์ ์ฅ๋์ง ์๊ณ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋์ด ํ ํฐ ์์ฒด๋ก ๊ฒ์ฆ์ ํ๋ฉฐ ์ฌ์ฉ์ ๊ถํ ์ธ์ฆ์ ์งํํ๊ธฐ ๋๋ฌธ์, Access Token์ด ํ์ทจ๋๋ฉด ํ ํฐ์ด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง, ํ ํฐ์ ํ๋ํ ์ฌ๋์ ๋๊ตฌ๋ ๊ถํ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ ๋ฌธ์ ์ ์ด ์์๋ค.
๊ทธ๋์ ํ ํฐ์ ์ ํจ ์๊ฐ์ ๋ถ์ฌํ์ฌ ํ์ทจ ๋ฌธ์ ์ ๋ํด ๋์์ ํ๊ธฐ๋ ํ์ง๋ง, ๋ง์ผ ์ ํจ ๊ธฐ๊ฐ์ด ์งง์ ๊ฒฝ์ฐ ๊ทธ๋งํผ ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ์ ์์ฃผํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Refresh Token ์ด๋ผ๋ ์ถ๊ฐ์ ์ธ ํ ํฐ์ ํ์ฉํ์ฌ ํ ํฐ์ ์ด์ค ์ฅ๋ง์ ์ณ์ ๋ณด๋ค ๋ณด์์ ๊ฐํํ๋ ์์ผ๋ก ๋ณด๋ฉด ๋๋ค.
# ์ฐธ๊ณ ์๋ฃ
https://cbw1030.tistory.com/331
https://velopert.com/2350
https://pronist.dev/143