์๋๋ก์ด๋ ๊ฐ๋ฐ์์ธ ๋๋ ๋ก๊ทธ์ธ์ ๊ตฌํํ ๋ ๋น์ฐํ๊ฒ jwt ํ ํฐ ์ธ์ฆ๋ฐฉ์์ ์จ์์๋ค. jwt ํ ํฐ์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด์๋์ง ์ jwt ํ ํฐ์ ์ฌ์ฉํด์ผํ๋์ง์ ๋ํ ๊ณ ๋ฏผ์ ํ์ง ์์์๋ค. ๊ทธ๋ ๋ค.. ๊ฐ๋ฐ์๋ก์ ์ฑ์ฅํ ์์ธ๊ฐ ์๋์ด์์๋ค.๐ข ๊ณผ๊ฑฐ์ ๋๋ฅผ ๋ฐ์ฑํ๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๊ณต๋ถํ ๊ฒ์ ๊ณต์ ํ๊ณ ์ jwt ํ ํฐ์ ๊ด๋ จ๋ ๊ธ์ ์์ฑํ๊ธฐ๋ก ํ๋ค.
JWT(Json Web Token)์ Json ๊ฐ์ฒด์ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ๋ด์ ํ ๋น๋ฐํค๋ก ์๋ช ํ ํ ํฐ์ผ๋ก, ์ธํฐ๋ท ํ์ค ์ธ์ฆ ๋ฐฉ์์ด๋ค. ๊ณต์์ ์ผ๋ก ์ธ์ฆ(Authentication) & ๊ถํํ๊ฐ(Authorization) ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.
์ฌ๊ธฐ์ ์ผ๋ฐ ๋ก๊ทธ์ธ ๊ณผ์ ๊ณผ ์ธ์ฆ ๋ฐฉ์์ ํท๊ฐ๋ฆด ์ ์๋ค. ๋ฐ๋ก jwt ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ณด์.
๋ก๊ทธ์ธ ์์ฒญ
์ ๋ณด๋ธ๋ค. ๋น๋ฐํค
๋ฅผ ์ฌ์ฉํด json ๊ฐ์ฒด๋ฅผ ์ํธํํ JWT ํ ํฐ์ ๋ฐ๊ธ
ํ๋ค.ํค๋
์ ๋ด์ ํด๋ผ์ด์ธํธ์ ๋ณด๋ธ๋ค.์ฌ๊ธฐ๊น์ง๊ฐ JWT๋ฅผ ๋ฐ๊ธ๋ฐ๊ธฐ๊น์ง์ (๋ก๊ทธ์ธ ์ )๊ณผ์ ์ด๋ค. ๋ก๊ทธ์ธ ์ดํ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ด ์ด๋ฃจ์ด์ง๋ค.
๋ก์ปฌ์ ์ ์ฅ
ํด๋๋๋ค.API ํธ์ถ
์ ํ ๋๋ง๋ค header์ JWT๋ฅผ ์ค์ด ๋ณด๋ธ๋ค
.ํค๋๋ฅผ ๋งค๋ฒ ํ์ธ
ํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ขฐํ ๋งํ์ง ์ฒดํฌ
ํ๊ณ , ์ธ์ฆ์ด ๋๋ฉด API์ ๋ํ ์๋ต์ ๋ณด๋ธ๋ค.๊ทธ๋ฐ๋ฐ ๋ก๊ทธ์ธ ํ์ ์ ๋งค๋ฒ JWT๋ฅผ ํค๋์ ๋ฃ์ด์ ๋ณด๋ด์ผ ํ ๊น? ๋นํจ์จ์ ์ด๋ผ๋ ์๊ฐ์ด ๋ค ์ ์๋ค. ๋งค๋ฒ ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ ์ด์ ๋ HTTP์ ํน์ฑ ๋๋ฌธ์ด๋ค.
Connectionless : ํ ๋ฒ ํต์ ์ด ์ด๋ค์ง๊ณ ๋ ํ์ ์ฐ๊ฒฐ์ด ๋ฐ๋ก ๋์ด์ง๋ค
Stateless : ์ด์ ์ํ๋ฅผ ์ ์ง/๊ธฐ์ตํ์ง ์๋๋ค
์ธํฐ๋ท์ ์ฌ์ฉํ๋ ์ฐ๋ฆฌ๋ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํด์ ํต์ ์ ํ๋ค. ์น ํ์ด์ง๋ฅผ ์ด ๋๋, ํธ๋ํฐ ์ดํ์ ์ฌ์ฉํ ๋๋, ํด๋ผ์ฐ๋๋ฅผ ์ฌ์ฉํ ๋๋ HTTP ํต์ ์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ HTTP๋ connectionless
ํ๊ณ stateless
ํ๋ค๋ ํน์ฑ์ด ์๋ค. ์ฝ๊ฒ ์ค๋ช
ํ๋ฉด ํ ๋ฒ ํต์ ์ด ์ผ์ด๋๊ณ ๋๋ฉด ์ฐ๊ฒฐ์ด ๋์ด์ง๋ค๋ ๊ฒ์ด๊ณ , ๋ค์ ์ฐ๊ฒฐํด๋ ์ด์ ์ํ๋ฅผ ์ ์งํ์ง ์์ ๊ณผ๊ฑฐ์ ์ด๋ค ์ ๋ณด๋ฅผ ๋ณด๋์๋์ง ๊ธฐ์ตํ์ง ๋ชปํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ํ๋ฉด์ ์ด๋ํ๋ฉฐ ์๋ก์ด API๋ฅผ ์์ฒญํ๋ฉด ๋ค์ ์ ๋ขฐํ ๋งํ ์ฌ์ฉ์์ธ์ง ์ธ์ฆํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ ๊ฒ์ด๋ค.
๋งค๋ฒ ์ฌ์ฉ์๊ฐ ์ธ์ฆํ๋ ๊ณผ์ ์ ๊ท์ฐฎ์ ๋ฟ๋ง ์๋๋ผ ํต์ ์ด ๋๋ ค์ง๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ๋ฐ๋ผ์ ์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์ด๋ ์ ๋ ๊ธฐ๊ฐ๋์ ์ฌ์ธ์ฆ ํ์ง ์์๋ ๋๋๋ก(๋ก๊ทธ์ธ์ด ์ ์ง๋๋๋ก) ๋ง๋ ๊ฒ์ด Access Token
์ด๋ค.
Access Token์ jwt ํ ํฐ์ ์ผ์ข ์ด๊ธฐ์ ๋จผ์ jwt ๊ตฌ์กฐ์ ๋ํด ์ค๋ช ํ๊ณ ๋ค์ ์ฑํฐ์์ Access token๊ณผ Refresh token์ ๋ํด ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
JWT๋ Header
, Payload
, Signature
3๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
๐ย Header
Signature์์ ์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ผ๋ก RS256
(๊ณต๊ฐํค/๊ฐ์ธํค)์ HS256
(๋น๋ฐํค(๋์นญํค))๊ฐ ์๋ค. ์ด ๋ถ๋ถ์ auth0 ๊ณต์ ๋ฌธ์์์ ์์ธํ ์ค๋ช
ํด์ฃผ๊ณ ์๋ค.
๐ย Payload
์ฌ์ฉ์ ์ ๋ณด์ ํ ์กฐ๊ฐ์ธ ํด๋ ์(claim)์ด ๋ค์ด์๋ค.
๐ย Signature
Signature๋ ํค๋์ ํ์ด๋ก๋์ ๋ฌธ์์ด์ ํฉ์น ํ์, ํค๋์์ ์ ์ธํ ์๊ณ ๋ฆฌ์ฆ๊ณผ key๋ฅผ ์ด์ฉํด ์ํธํ ๊ฐ์ด๋ค.
Header์ Payload๋ ๋จ์ํ Base64url๋ก ์ธ์ฝ๋ฉ๋์ด ์์ด ๋๊ตฌ๋ ์ฝ๊ฒ ๋ณตํธํํ ์ ์์ง๋ง, Signature๋ key๊ฐ ์์ผ๋ฉด ๋ณตํธํํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋ณด์์ ์์ ํ๋ค๋ ํน์ฑ์ ๊ฐ์ง ์ ์๊ฒ ๋์๋ค.
์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ header์์ ์ ์ธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ key๋ ๊ฐ์ธํค๊ฐ ๋ ์๋ ์๊ณ ๋น๋ฐํค๊ฐ ๋ ์๋ ์๋ค. ๊ฐ์ธํค๋ก ์๋ช ํ๋ค๋ฉด ๊ณต๊ฐํค๋ก ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์๊ณ , ๋น๋ฐํค๋ก ์๋ช ํ๋ค๋ฉด ๋น๋ฐํค๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฌ๋๋ง์ด ์ํธํ ๋ณตํธํ, ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ ์ ์๋ค.
https://jwt.io/ ์ ๋ค์ด๊ฐ token ๊ฐ์ ์
๋ ฅํ๋ฉด ํ์ฌ ์์ ์ด ์ฌ์ฉ์ค์ธ jwt ํ ํฐ์ด ์ด๋ค ๊ตฌ์กฐ๋ก ๋์ด์๋์ง ์ฝ๊ฒ ๋์ผ๋ก ํ์ธํ ์ ์๋ค. ์ง๊ธ๊น์ง ์ค๊ณง ์ฌ์ฉํ๋ ํ ํฐ์ ๊ตฌ์กฐ๋ฅผ ๋๋์ด ์ฒ์ ์์ ํ๋ค..ใ
์ฐธ๊ณ ๋ก exp์ iat์ ๊ฒฝ์ฐ DateTime์ ๋ง์ฐ์ค๋ฅผ ๊ฐ๋ค ๋๋ฉด ์ ํํ ๋ ์ง์ ์๊ฐ์ด ๋ฐ๋ก ๋์จ๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๊นจ๋ฌ์์ผํ ๊ฒ์ด ์๋ค. header์ payload๋ ์ด๋ ๊ฒ ๋๊ตฌ๋ ์ฝ๊ฒ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ๋ค์๋ ์ค์ํ ์ ๋ณด๋ฅผ ๋ด์ผ๋ฉด ์๋๋ค๋ ๊ฒ์ด๋ค!
๐ย ์ฅ์
๐ย ๋จ์
์ฅ์ : ๋คํธ์ํฌ ๋ถํ๊ฐ ์ ๊ณ ๋ชจ๋ฐ์ผ ์ฑ์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ๋ค
๋จ์ : ํ ํฐ ํฌ๊ธฐ๋ฅผ ์ ๊ฒฝ์จ์ผํ๊ณ , ๋ง๋ฃ ๊ธฐ๊ฐ ์ฒ๋ฆฌ๋ฅผ ๋ฐ๋ก ํด์ค์ผํ๋ค
๋ค์ ์ฑํฐ์์๋ access token๊ณผ refresh token์ ๋ํด ๋ค๋ฃจ๊ณ , ์๋๋ก์ด๋์์๋ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ๋์ง ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค! ๊ฐ์ฌํฉ๋๋ค!๐
https://auth0.com/docs/secure/tokens/json-web-tokens
https://brunch.co.kr/@jinyoungchoi95/1
https://velog.io/@junghyeonsu/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%90%EC%84%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8%EC%9D%84-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95
์ ๋ฆฌ๊ฐ ๋๋ฌด ์๋์ด ์์ด์ ์ดํดํ๊ธฐ ์ฌ์ ์ด์! ๊ฐ์ฌํฉ๋๋ค!