JWT ํ ํฐ์ ์ด์ฉํด ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์์ ๊ตฌ๊ธ๋ง์ ํตํ์ฌ ํด๋น ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ ์ํด ๊ธ์ ์จ๋ด ๋๋ค.
์ธ์ฆ๊ณผ ์ธ๊ฐ
์ธ์ฆ(Authentication)
์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ๋ ๊ณผ์ . (ex. ๋ก๊ทธ์ธ)
์ธ๊ฐ(Authorization)
์ฌ์ฉ์์ ๋ํด ์์ ์ ๊ทผ ๊ถํ๊ฐ์ ๊ฒ์ ํ๋ฝํ๋ ๊ฒ. (ex. ์นดํ ๋ฑ๊ธ๋ณ ๊ฒ์๋ฌผ)
HTTP
HTTP๋ ๋น์ฐ๊ฒฐ์ฑ ๋ฐ ๋ฌด์ํ์ฑ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๋ ํ๋กํ ์ฝ์ด๋ค. ์ฆ, ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ ํ์๋ ์์ฒญ์ ํ ํด๋ผ์ด์ธํธ์ ์ด๋ ํ ์ ๋ณด๋ ๋จ๊ธฐ์ง ์๋๋ค. ์ด๋ฌํ ํน์ง ๋๋ถ์ ์๋ฒ๋ ๋ง์ ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ ์ ์งํ์ง ์์ ์๋ฒ์ ์์๋ ์๋ผ๊ณ ๋ถ๋ด๋ ์ ๋ค.
๊ทธ๋ฌ๋, ์ฐ๊ฒฐ์ ์ ์งํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐฉ๊ธ ์ ์์ฒญํ ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ์์ฒญ์ ๋ณด๋ด๋ ์ด์ ์ ์์ฒญํ ํด๋ผ์ด์ธํธ์ธ์ง ๊ตฌ๋ถํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ๋ก๊ทธ์ธ์ ํตํด ์ด๋ค ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์์ด๋ ๋ค์ ์์ฒญ์ ์๋ฒ๋ ๊ทธ๊ฒ์ ๊ธฐ์ตํ์ง ๋ชปํด ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ๋ก๊ทธ์ธํด์ผ ๋๋ ์ํฉ์ด ์๊ฒจ๋ฒ๋ฆฐ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํ ๋ฐฉ๋ฒ์ผ๋ก Cookie์ Session์ ์ด์ฉํ๋ค.
Cookie์ Session
Cookie
์ฟ ํค๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ปดํจํฐ(์น ๋ธ๋ผ์ฐ์ )์ ์ ์ฅํ๋ ์์ ์ ๋ณด ํ์ผ์ด๋ค. Key-Value ํ์์ ๋ฌธ์์ด๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์๋ต ํค๋ ์ Set-Cookie ์์ฑ์ ์ฟ ํค๋ฅผ ๋ด์ ๋ณด๋ธ๋ค. ์ฌ๋ฌ ๊ฐ์ ์ฟ ํค๋ฅผ ๋ณด๋ด๊ณ ์ถ๋ค๋ฉด Set-Cookie ์์ฑ์ ์ฌ๋ฌ ๊ฐ ๋ฃ์ผ๋ฉด ๋๋ค. ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ํ ์ ๋ณด๋ฅผ ์ฟ ํค๋ก ๋ณด๋ด์ด ์ด๋ฅผ ํ์์ ํ์ฉํ๋ค.
๋ก๊ทธ์ธ์ ์์๋ก ๋ณดํต ์ฐ๋ฆฌ๋ ์ด๋ค ์น ์ฌ์ดํธ์์ ๋ก๊ทธ์ธ์ ํ๋ฉด ๊ทธ ์ดํ์๋ ๋ค์ ID์ ํจ์ค์๋์ ์ ๋ ฅ์์ด ๋ก๊ทธ์ธ ๋ ์ํ์์ ํ ์ ์๋ ์์ ๋ค์ ํ ์ ์๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ ์๋ฒ์์ ๋ก๊ทธ์ธ์ ๋ํ ์์ฒญ์ ์๋ตํ ๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅํ๊ณ ์ถ์ ์ ๋ณด๋ค์ ์๋ตํค๋ ์ ์ฟ ํค์ ๋ด์ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋ฉด, ์ดํ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ์๋ง๋ค ์์ฒญํค๋ ์ Cookie์ ์๋ฒ๊ฐ ๋ณด๋ธ ์ฟ ํค๊ฐ ์๋์ผ๋ก ๋ด๊ฒจ ํด๋น ์๋ฒ๋ก ๋ณด๋ด์ง๋ค.
์ด๋ฅผ ํตํด ์๋ฒ๋ ์ฟ ํค๋ฅผ ๊ฒ์ฌํ๊ณ ํด๋น ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์๋ ์ฌ์ฉ์์ธ์ง ํ๋จํ๊ณ ๋ก๊ทธ์ธ ๋ ์ํ๋ฅผ ์ ์ง์์ผ ์ฃผ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, ๋งค๋ฒ ์ฟ ํค๋ฅผ ํตํด ์ฌ์ฉ์๋ฅผ '์ธ์ฆ'ํ๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ์ ์ด ์๋ค.
- ์ฟ ํค๋ ๋ ธ์ถ ์ ํด๋น ๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋๋ค.
- ์ฟ ํค๋ ์ฝ๊ฒ ํธ์งํด์ ๋ณด๋ผ ์ ์๋ค.
- ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ ํ์ ์ด๋ค.
Session
๊ทธ๋์ ๋์จ ๊ฒ์ด ๋ฐ๋ก Session์ด๋ค. ์ค์ ์ฟ ํค๋ก ์ ์ ์ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค๋ ์ ์ ๋ ๋์ผํ๋ค. ํ์ง๋ง, ์ธ์ ์ ๊ฐ ํด๋ผ์ด์ธํธ ๋ณ๋ก Session ID๋ผ๋ ๊ฒ์ ๋ถ์ฌํด ์ด๋ฅผ ์๋ฒ์ ์ ์ฅํด๋๊ณ ์ฟ ํค๋ก ์ ๋ฌํด ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ์ ์ ๋ฌํ ์ ์๋๋ก ํ๋ค.
Session ID๋ ์๋ฒ์์ ๊ด๋ฆฌํ๋ฉฐ ์ผ์ ์๊ฐ ํน์ ์๋ก์ด ์ ์ ์๋ง๋ค ๋ค๋ฅด๊ฒ ํ ๋น๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ์ ์ ์ ๋ณด๋ง์ ์ ๋ฌ๋ฐ๋ ์ฟ ํค๋ณด๋ค๋ ์์ ํ๋ค๋ ์ฅ์ ์ด ์๋ค. ํ์ง๋ง, ์๋ฒ์์ ์ด๋ฐ ์ธ์ ์ ๋ณด๋ค์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๊ฐ ์ ์ ์ ๋ณด์ ๋ํด์ ์ธ์ ID๋ฅผ ์ ์ฅํด์ผํ๋ค๋ ๋ถ๋ด์ด ์๋ค.
JWT
JWT๋ Json ๊ฐ์ฒด์ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ๋ด์ ์ํธํ ์ํจ ํ ํฐ์ ์๋ฏธํ๋ค.
JWT ํ ํฐ์ HTTP ํค๋๋ URL ํ๋ผ๋ฏธํฐ์ ์ค์ด ๋ณด๋์ผ๋ก์จ ์ฌ์ฉ์์ ๋ํ ์ธ๊ฐ, ์ธ์ฆ ๊ณผ์ ์ ๊ตฌํํ ์ ์๋ค. Session ID์ ๋ฌ๋ฆฌ ๊ฐ์ธํค๋ฅผ ํตํ ์ ์์๋ช ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณด์์ด ์์ ๋ ๋ฐฉ๋ฒ๋ณด๋ค ๋ฐ์ด๋๋ค.
JWT ๊ตฌ์กฐ

JWT๋ . ์ ๊ตฌ๋ถ์๋ก 3๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
Header.Payload.Signature
Header์๋ ํ ํฐ์ ํ์ ๊ณผ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ง์ ํ๋ค. ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ๋์ค์ Signature๋ถ๋ถ์์ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธํ๋ค.
Payload์๋ ์๋ฒ์์ ๋ด๊ณ ์ํ๋ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด ๋ฐ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋ค.
Signature์๋ Header์ Payload๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ์ฌ ์ด ๊ฐ๋ค์ Header ์ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๋ฐ ํค๋ก ์ํธํํ ๊ฐ์ด ๋ด๊ธด๋ค.
์ ๋ณด ใ ก payload
payload์๋ ์๋ฒ๊ฐ ํ ํฐ์ ๋ด์ ์ ๋ณด๋ค์ด ์๋ค. ๋ด๋ ์ ๋ณด์ ํ ์กฐ๊ฐ์ ํด๋ ์(claim)์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ ์ด๋ name: value ๊ผด๋ก ๋์ด์๋ค. ์์ ์ฌ์ง์์ "sub": "1234567890"์ด ํ๋์ ํด๋ ์์ด ๋๋ ๊ฒ์ด๋ค.
ํด๋ ์ ์ข ๋ฅ๋ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋๋ค.
- registered
- public
- private
registered
registered ํด๋ ์๋ค์ ์๋น์ค์ ํ์ํ ์ ๋ณด๊ฐ ์๋ ํ ํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ์ฆ, ์ด๋ฏธ ์ฝ์๋์ด ์ด๋ฆ์ด ์ ํด์ง ํด๋ ์๋ค์ด๋ค.
- iss : ํ ํฐ ๋ฐ๊ธ์
- sub : ํ ํฐ ์ ๋ชฉ
- aud : ํ ํฐ ๋์์
- exp : ํ ํฐ ๋ง๋ฃ ์๊ฐ
- nbf : ํ ํฐ ํ์ฑ ๋ ์ง
- iat : ํ ํฐ ๋ฐ๊ธ ์๊ฐ
- jti : JWT์ ๊ณ ์ ์๋ณ์
public
ํด๋น ํด๋ ์์ ์ถฉ๋์ด ๋ฐฉ์ง๋ ์ด๋ฆ์ ๊ฐ๊ณ ์์ด์ผ ํ๋ฉฐ ์ด๋ฅผ ์ํด ํด๋ ์ ์ด๋ฆ์ URI ํ์์ผ๋ก ์ง๋๋ค.
private
๋น๊ณต๊ฐ ํด๋ ์์ ์ฌ์ฉ์ ์ ์ ํด๋ ์์ด๋ฉฐ, ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ์ฝ์๋ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
์๋ช ใ ก signature
์ด ๊ฐ์ ํค๋์ ์ ๋ณด๋ฅผ ๊ฐ๊ฐ base64๋ก ์ธ์ฝ๋ฉํ ํ ๋ ๊ฐ์ ํฉํด ๋น๋ฐํค๋ก ํด์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฑฐ์ณ ์์ฑํ๋ค. ์์ ์ฌ์ง๋๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ง๋ค์ด์ง๋ค.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secretKey
)
๊ทธ๋ฆฌ๊ณ ํด๋น ํด์ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋์จ ๊ฐ์ base64๋ก ์ธ์ฝ๋ฉ ํ์ฌ, ๋งจ ๋ค์ ๋ถ์ฌ์ฃผ๋ ๊ฒ์ด๋ค. ์ด ์๋ช ์ ํตํด JWT ํ ํฐ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฆ์ ์ด๋ฃจ์ด๋ธ๋ค. ๊ทธ๋ ๊ฒํด์ ์ต์ข ์ ์ผ๋ก ์ด๋ฐ ํํ์ JWT ํ ํฐ์ด ํ๋ ๋ง๋ค์ด์ง๋ค.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
๊ทผ๋ฐ ํ ํฐ์ด ๋ง๋ค์ด์ง๋ ๊ณผ์ ์ ๋ณด๋ฉด ๊ฒฐ๊ตญ Payload์ ๋ํ ๋ถ๋ถ์ด base64๋ก ์ธ์ฝ๋ฉ ๋์ด์์ ๋ฟ ๋ ธ์ถ๋์ด ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ payload์๋ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์์์ผํ๋ค. ๋ํ, ์ฟ ํค๋ Session ID์ ๋นํด ํ ํฐ์ ๊ธธ์ด๊ฐ ์๋นํ ๊ธด ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ฆ, ์ ๋ณด๊ฐ ๋ง์์ง ์๋ก ํ ํฐ์ ๊ธธ์ด๊ฐ ๋์ด๋ ๋ถ๋ด์ด ๋ ์ ์๋ค.
JWT ๊ณผ์
- ์ฌ์ฉ์๊ฐ ์์ด๋, ๋น๋ฐ๋ฒํธ์ ํจ๊ป ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ํด๋น ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ DB์์ ์ผ์นํ๋์ง ํ์ธํ๋ค.
- ์ผ์นํ๋ค๋ฉด ์๋ฒ๋ ๋น๋ฐ ํค๋ก json ๊ฐ์ฒด๋ฅผ ์ํธํํด JWT ํ ํฐ์ ๋ฐ๊ธํ๋ค.
- JWT ํ ํฐ์ ํค๋์ ๋ด์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ธ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ด๋ฅผ ์ ์ฅํด๋์๋ค๊ฐ ์์ฒญ ์๋ง๋ค JWT ํ ํฐ์ ํจ๊ป ๋ณด๋ธ๋ค.
- ์๋ฒ๋ ๋งค๋ฒ ํค๋๋ฅผ ํ์ธํด ์๋ฒ์์ ๋ฐํํ ํ ํฐ์ธ์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ์ฌ์ฉ์์ ์์ฒญ์ ์๋ตํ๋ค.
ํค๋์ ๋ฃ์ด๋ณด๋ผ ๋์๋ Authorization ํค๋์ ๋ด์ ๋ณด๋ธ๋ค. bearer๋ฅผ ์์ ๋ถ์ฌ์ฃผ๋๋ฐ ์ด๋ JWT ํ ํฐ ๋๋ OAuth ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๋ค.
{
"Authorization": "Bearer " + {ํ ํฐ ๊ฐ}
}
'๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MVC ํจํด (3) | 2024.10.15 |
---|---|
๋์ ํ๋ผ๋ฏธํฐํ ์ฝ๋ ์ ๋ฌํ๊ธฐ (6) | 2024.10.10 |
BeanFactory์ ApplicationContext, Configuration (0) | 2024.10.04 |
์คํ๋ง ๋ถํธ๋ฅผ ์ด์ฉํ ํ์ด์ง ๊ตฌํ (3) | 2024.09.27 |