JWT ํ ํฐ์ JSON Web Token์ ์ฝ์๋ก ์ ์ ์๋ช ๋ URL-safe์ JSON์ด๋ค.
์๋ ์๋ฒ์ ์ ์ฅํด์ผ ํ ์ธ์
๊ฐ์ ๊ทธ๋ฅ ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ชจ๋ ๋๊ฒจ๋ฒ๋ฆฌ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ์ฆ ์์ ํด๋น ํ ํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ๋ชจ๋ ํ๋๋ง ์์ผ๋ฉด ์ด๊ฒ ์์ฒด๊ฐ ์ธ์
์ ์ฅ์ ์ ์ฒด๋ฅผ ๋์ฒดํ๋ ์๋จ์ด ๋๋ ๊ฒ์ด๋ค.
JWT์ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉ๋๋ฉด์ ์๊ธฐ ์์ฉ์ ์ด๋ผ๋ ํน์ง์ด ์๋ค.
์๊ธฐ ์์ฉ์ ์ธ JWT๋ ์์คํ ์์ ๋ฐ๊ธ๋ ํ ํฐ์ด ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ์ ๋ณด, ์ ๋ฌํ ๋ด์ฉ, ๊ทธ๋ฆฌ๊ณ ํ ํฐ์ด ๊ฒ์ฆ๋๋ค๋ ๊ฒ์ ์ฆ๋ช ํด์ค๋ค.
JWT๋ ์ฌ์ฉ์์ ๊ณ ์ ์ฑ์ ์ ์ฆํ ๋งํ ๋ฐ์ดํฐ๋ฅผ ํฌ์ฅํ์ฌ ํ ํฐ์ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ํ ํฐ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋ฐ์์ ๋,
ํด๋น ํ ํฐ์์ ๋ค์ด์๋ ๊ณ ์ ๋ฐ์ดํฐ๋ก ์ฌ์ฉ์๋ฅผ ์๋ณํ์ฌ,
๋ณ๋์ ์ธ์ฆ ๊ณผ์ ์์ด ๋ฐ๋ก ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ค.
JWT๋ ๋ณตํธํ(decoding/์ํธํ์ ๋ฐ๋๋๋ ๋ง)๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ SECRET_KEY๋ฅผ ์ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํ๋ค.
(๋ณด์์ทจ์ฝ, ์ฌ์ฉ์์ ๋ํด ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๋๋ค.)
JWT๋ .์ ๊ธฐ์ค์ผ๋ก ์ธ ํํธ๋ก ๋๋๋ค.
๐Header
{ "alg": "์๋ช ์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ", "kid": "์๋ช ์ ์ฌ์ฉํ๋ ํค๋ฅผ ์๋ณํ๋ ๊ฐ", "typ": "ํ์ " }
ํค๋(Header)์๋ JWT๋ฅผ ์ด๋ป๊ฒ ๊ฒ์ฆํ๋์ง์ ๋ํ ๋ด์ฉ์ด ๋ค์ด๊ฐ ์๋ค.
ํ ํฐ์ ํ์ , ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ธ์ง์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์๋ค.
ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฆ์ ์ ์ด์ค ์ ์๋ค.
๐payload
{ "sub": "jinhui,Lee", "exp": 4561232123, "iat": 1234568734 }
ํ ํฐ์ ๋ด์์ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ด๊ณ ์ ํ๋ ๋ฐ์ดํฐ๊ฐ ์ด๊ณณ์ ๋ด๊ฒจ์ ธ ์๋ค.
์ด ์ ๋ณด์ ์กฐ๊ฐ์ ํด๋ ์(claim) ์ด๋ผ๊ณ ํ๊ณ , key - value์ ํ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๊ทธ๋ฆฌ๊ณ payload์๋ ์ฌ๋ฌ ๊ฐ์ ํด๋ ์์ ๋ด์ ์ ์๊ณ ,
ํด๋ ์์ ๊ณต๊ฐ(public) ํน์ ๋น๊ณต๊ฐ(private) ํ ๊ฒ์ธ์ง ๋ฑ๋ก(registered)ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ ์ ์๋ค.
๐signature
header+paylode
์๊ทธ๋์ฒ(signature)์๋ ์์ ํค๋(header)์ ํ์ด๋ก๋(Paylaod)๋ฅผ ํฉ์น ๋ฌธ์์ด์ ์๋ช ํ ๊ฐ์ด๋ค.
์๋ช ์ ํค๋์ alg์ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ secret key๋ฅผ ์ด์ฉํด ์์ฑํ๊ณ Base64 URL-Safe๋ก ์ธ์ฝ๋ฉํ๋ค.
secret key๋ฅผ ํฌํจํด์ ์ํธํ๊ฐ ๋์ด์๋ค.
์์ฑ๋ JWT๋ ์ (.)์ ๊ตฌ๋ถ์๋ก ํค๋, ํ์ด๋ก๋, ์๊ทธ๋์ณ๋ก ๋๋ ์ ์๋ก ์ ๋ฌํ๊ฒ ๋๊ณ ,
์๋ฒ๋ ํค๋์ alg, kid ์์ฑ๊ณผ ๊ณต๊ฐ ํค๋ฅผ ์ด์ฉํด ๊ฒ์ฆํ ์ ์๋ค.
๊ฒ์ฆ(์ด ํ ํฐ์ด ์ ๋ขฐํ ์ ์๋ ํ ํฐ์ธ๊ฐ?)๊ฐ ์ฑ๊ณตํ๋ฉด ํ์ด๋ก๋์ ๊ฐ์ผ๋ก ์ ๊ทผ์ ํด์ ์ฌ์ฉํ ์ ์๋ ๊ฒ.!
์ธ์ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ๋ณ๋์ ์ธ์ฆ ์ ์ฅ์๊ฐ ํ์ ์์ด์ ์๋ฒ์์ ์ปค๋ฎค๋์ผ์ด์ ์ ์ต์ํ์ผ๋ก ํ ์ ์๋ค.
ํธ๋ํฝ์ ๋ํ ๋ถ๋ด์ด ์ ๋ค.
์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ ๋ ๋ฆฝ์ ์ธ ๋๋์ JWT๋ฅผ ํ์ฉํ๋ค๋ ๊ฒ.
JWT์ ํฌ๊ธฐ๊ฐ ์ปค์ง์๋ก ๊ฑฐ์ ๋ชจ๋ ์์ฒญ์ ๋ํด ์ ์ก๋๋ฏ๋ก ๋ฐ์ดํฐ ํธ๋ํฝ ํฌ๊ธฐ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
ํ ํฐ์ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ DB์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์ ํ๋๋ผ๋ ํ ํฐ์ ์ง์ ์ ์ฉํ ์ ์๋ค.
API๋ ํ๋ก๊ทธ๋จ๋ค์ด ์๋ก ์ํธ์์ฉํ๋ ๊ฒ์ ๋์์ฃผ๋ ๋งค๊ฐ์ฒด!
Pirvate API๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ,
๊ฐ๋ฐ์๋ค์ด ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ํ์คํํจ์ผ๋ก์จ,
๊ฐ์ํ๋๊ณ ๋น ๋ฅธ ํ๋ก์ธ์ค ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
์ํํธ ์จ์ด๋ฅผ ํตํฉํ๊ณ ์ ํ ๋๋ ๊ฐ๋ฐ์๋ค ๊ฐ์ ํ์
์ ์ฉ์ดํ๊ฒ ๋ง๋ค์ด์ค๋ค.
Pubilc API์ Partner API๋ฅผ ์ฌ์ฉํ๋ฉด,
๊ธฐ์
์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ๋ธ๋๋ ์ธ์ง๋๋ฅผ ๋์ผ ์ ์๊ณ ,
๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฅํ์ฌ ์ ํ์จ๊น์ง ๋์ผ ์๊ฐ ์๋ค.
์๋ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ถ์ ๊ตฌ ์ญํ ์ ํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ธฐ๊ธฐ๊ฐ ์๋ก ์ํํ๊ฒ ํต์ ํ ์ ์๋๋ก ํ๋ค.
๋ชจ๋ ์ ์์ ํ์คํ ํ๋ค.
1. private API
: ๋ด๋ถAPI๋ก, ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์์ฒด ์ ํ๊ณผ ์๋น์ค๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ๋ฐํํ๋ค.
(์ 3์์๊ฒ ๋
ธ์ถ X)
2. pubilc API
: ๊ฐ๋ฐฉํ API๋ก, ๋ชจ๋์๊ฒ ๊ณต๊ฐ๋๋ค. ๋๊ตฌ๋ ์ ํ ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค!
3. partner API
: ๊ธฐ์
์ด ๋ฐ์ดํฐ ๊ณต์ ์ ๋์ํ๋ ํน์ ์ธ๋ค๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค. ๋น์ฆ๋์ค ๊ด๊ณ์์ ์ฌ์ฉ๋๋ ํธ์ด๋ฉฐ,
์ข
์ข
ํํธ๋ ํ์ฌ ๊ฐ์ ์ํํธ์จ์ด๋ฅผ ํตํฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.