[Security] JWT(Json Web Token) ์ธ์ฆ ๋ฐฉ์
by rlaehddnd0422JWT(JSON Web Token)์ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ ์ํจ JSON ํ ํฐ์ ์๋ฏธํฉ๋๋ค.
JWT ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์ JWT์ HTTP ํค๋์ ์ค์ด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ๋ ๋ฐฉ์์ ๋๋ค.
โ๏ธJWT(Json Web Token)
ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ JWT = Base64 Encode(Header + payload + Signature)
JWT์๋ ๊ฐ๊ฐ์ ๊ตฌ์ฑ์์๊ฐ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋์ด ์์ผ๋ฉฐ ๊ตฌ์ฑ์์๋ 3๊ฐ์ง์ ๋๋ค.
Header : ํ ํฐ์ ํ์ , JWT ์์ฑ์ ์ฌ์ฉ๋ ํด์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฅํฉ๋๋ค.
Payload : ํ ํฐ์์ ์ฌ์ฉํ ์ ๋ณด์ ์กฐ๊ฐ๋ค์ธ Claim ์ด ๋ด๊ฒจ์์ต๋๋ค. (์ค์ JWT ๋ฅผ ํตํด์ ์ ์ ์๋ ๋ฐ์ดํฐ)
์ฆ, ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ์์คํ ์์ ์ค์ ๋ก ์ฌ์ฉ๋ ์ ๋ณด์ ๋ํ ๋ด์ฉ์ ๋ด๊ณ ์๋ ์น์ ์ ๋๋ค.
Signature : ์๊ทธ๋์ฒ๋ "์ ์ํ Header์ Palyoad๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ ๊ฐ + ์๋ฒ์ Secret Key(Base64 ์ธ์ฝ๋ฉ์ ์ ํ)"์ Header์์ ์ ์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด์ํํ ๊ฐ์ ๋๋ค.
โก๏ธ Signature : HS_Algorithm(Base64Encode(Header) + Base64Encode(Payload) + Secret Key )
โถ๏ธ JWT = Base64 Encode(Header + payload + Signature(HS_Algorithm(Base64Encode(Header) + Base64Encode(Payload) + Server's Secret Key))
๊ฐ์ฅ ์ค์ํ๊ฑด ์๋ฒ์ ์ํฌ๋ฆฟ ํค!
Header์ Payload๋ ๋จ์ํ ์ธ์ฝ๋ฉ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ 3์๊ฐ Decodeํ์ฌ ๋ฐ ์กฐ์ํ ์ ์์ง๋ง, Signature๋ ์๋ฒ ์ธก์์ ๊ด๋ฆฌํ๋ ๋น๋ฐํค๊ฐ ์ ์ถ๋์ง ์๋ ์ด์ ๋ณตํธํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ Signature๋ ํ ํฐ์ ์๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
โ๏ธJWT ์ฅ์
- ์ธ์ฆ ์ ๋ณด์ ๋ํ ๋ณ๋์ ์ ์ฅ์๊ฐ ํ์ ์์ต๋๋ค. (์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ํ ํฐ์ ๊ฒ์ฆ๋ง ํ๋ฉด ok)
์๋ฒ์์ ๊ฐ์ฅ ํผํด์ผ ํ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ์ ๋๋ค.
์๋ฒ ์์ฒด๊ฐ ์ฃฝ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, ๋๋ถ๋ถ DB๊ฐ ํฐ์ ธ์ ์๋ฒ๋ ๊ฐ์ด ์ฃฝ๋ ๊ฒฝ์ฐ๊ฐ ํ๋คํ๊ธฐ ๋๋ฌธ์ด๋ค.
- Header์ Payload๋ฅผ ๊ฐ์ง๊ณ Signature๋ฅผ ์์ฑํ๋ฏ๋ก ๋ฐ์ดํฐ ์๋ณ์กฐ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
- JWT๋ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด์ ์ ๋ฌํ ์ ๋ณด ๋ฐ ํ ํฐ์ด ๊ฒ์ฆ๋์์์ ์ฆ๋ช ํ๋ ์๋ช ๋ฑ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ฅผ ์์ฒด์ ์ผ๋ก ์ง๋๊ณ ์์ต๋๋ค.
โ๏ธJWT ๋จ์
- ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ stateless ํน์ง์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ด๋ฆฌํ๊ณ ์ ์ฅํฉ๋๋ค. ๋๋ฌธ์ ํ ํฐ ์์ฒด๋ฅผ ํ์ทจ๋นํ๋ฉด ๋์ฒํ๊ธฐ๊ฐ ์ด๋ ต๊ฒ ๋ฉ๋๋ค.
- JWT๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ , Access Token / Refresh Token์ผ๋ก ์ด์ค์ผ๋ก ๋๋์ด ์ธ์ฆ์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์ฒํฉ๋๋ค.
- ํ ํฐ ์์ฒด์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก ์๋ ์ ๊ฒ์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ค์ํ ์ ๋ณด๋ ํ์ด๋ก๋์ ๋ด์ง ์๋๊ฒ์ด ์ข์ต๋๋ค.
โ๏ธJWT๋ฅผ ์ด์ฉํ ์ธ์ฆ ๊ณผ์
1. ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ ๋๋ค.
2. ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ID์ PW๋ฅผ ํ์ธ ํ, Header, Payload, Signature๋ฅผ ์ ์ํฉ๋๋ค.
+ Header, Payload, Signature๋ฅผ ํ๋ฒ ๋ Base 64๋ก ์ธ์ฝ๋ฉํ์ฌ Access Token๊ณผ Refresh Token๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ๊ธํฉ๋๋ค.
Access Token : ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ณ ์๋ ์ค์ ๋ก ์ ์ ์ ์ ๋ณด๊ฐ ๋ด๊ธด ํ ํฐ์ผ๋ก, ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ด ์ค๋ฉด ์๋ฒ์์ ํด๋น ํ ํฐ์ ์๋ ์ ๋ณด๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ณด์ ๋ง๊ฒ ์๋ต์ ์งํํฉ๋๋ค.
Refresh Token: ์๋ก์ด Access Token์ ์ฌ๋ฐ๊ธํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ํฐ. ํด๋น ํ ํฐ์ ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ์ ๋ณด์ ๊ฐ์ด ๊ธฐ๋ก๋ฉ๋๋ค.
3. ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ JWT(Access Token, Refresh Token)์ ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅํ๊ณ ์ด ํ ์์ฒญํ ๋ ์ก์ธ์ค ํ ํฐ์ ํค๋์ ๋ฃ์ด ์์ฒญ์ ๋ณด๋ ๋๋ค.
4. ์๋ฒ์์๋ ์ก์ธ์ค ํ ํฐ์ ๊ฒ์ฆํ๊ณ , ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ตํด์ค๋๋ค.
5. ๋ง์ฝ ํด๋ผ์ด์ธํธ์ ์ก์ธ์ค ํ ํฐ์ ์ ํจ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ๋ฆฌํ๋ ์ ํ ํฐ์ ์๋ฒ์ ์ ๋ฌํ์ฌ ์ก์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธ ์์ฒญํฉ๋๋ค.
6. ๋ฆฌํ๋ ์ ํ ํฐ์ ๊ฒ์ฆํ์ฌ ์ก์ธ์ค ํ ํฐ์ ์ฌ๋ฐ๊ธํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.
๋ก๊ทธ์์์ ํ๋ฉด Access Token๊ณผ Refresh Token์ ๋ชจ๋ ๋ง๋ฃ์ํต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > Spring Security' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422