๐ ํ ๋ฒ์ ์ดํดํ๋ JWT ๋์นญ ์๋ช
๋ฐฉ์์ ๋ชจ๋ ๊ฒ! ๐
JSON Web Token(JWT)์ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ์ค์
๋๋ค. ํ์ง๋ง JWT์ ์๋ ๋ฐฉ์๊ณผ ํนํ ๋์นญ ์๋ช
๋ฐฉ์์ ๋ํ ์ดํด๋ ๋ณต์กํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ JWT์ ํต์ฌ ๊ฐ๋
๋ถํฐ ๋์นญ ์๋ช
๋ฐฉ์์ ์๋ ์๋ฆฌ๊น์ง, ๋ชจ๋ ๋ด์ฉ์ ์ฝ๊ฒ ํ์ด๋ณด๊ฒ ์ต๋๋ค! ๐
๐ JWT๋ ๋ฌด์์ธ๊ฐ์?
JSON Web Token(JWT)๋ JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋น์ฌ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์กํ๊ธฐ ์ํ ๊ฐ๋ฐฉํ ํ์ค(RFC 7519)์
๋๋ค. JWT๋ ๋์งํธ ์๋ช
์ ํตํด ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
JWT์ ์ฃผ์ ๊ตฌ์ฑ ์์
-
Header (ํค๋)
{
"alg": "HS256",
"typ": "JWT"
}
- ํ ํฐ์ ์ ํ๊ณผ ์๋ช
์ ์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
-
Payload (ํ์ด๋ก๋)
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- ์ฌ์ฉ์ ์ ๋ณด๋ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ ๋ฑ ์ค์ ์ ์กํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค.
-
Signature (์๋ช
)
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
- ํค๋์ ํ์ด๋ก๋๋ฅผ ๊ฒฐํฉํ๊ณ , ๋น๋ฐํค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ์๋ช
์
๋๋ค.
๐ ์๋ช
์ด ์ ์ค์ํ ๊น์?
JWT๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ ๋ขฐํ ์ ์๋ ์ ๋ณด ์ ๋ฌ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ํ์ง๋ง JWT๋ ์ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ ํ์ด๋ก๋์ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ ์ ์์๊น์? ๋ฐ๋ก ์๋ช
(Signature) ๋๋ถ์
๋๋ค!
- ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ: ์๋ช
์ ํตํด ํ ํฐ์ด ์์ฑ๋ ์ดํ ๋ณ๊ฒฝ๋์ง ์์์์ ํ์ธํ ์ ์์ต๋๋ค.
- ์ธ์ฆ๋ ๋ฐํ์ ํ์ธ: ์๋ช
๊ฒ์ฆ์ ํตํด ํ ํฐ์ด ์ ๋ขฐํ ์ ์๋ ๋ฐํ์๋ก๋ถํฐ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
๐ค ๋์นญ ์๋ช
๋ฐฉ์์ด๋?
๋์นญ ์๋ช
๋ฐฉ์์ ํ๋์ ๋น๋ฐํค(secret key)๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช
์ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์๋ฒ๋ง์ด ๋น๋ฐํค๋ฅผ ์๊ณ ์๋ค๋ ๊ฒ์
๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋น๋ฐํค๋ฅผ ์์ง ๋ชปํ๋ฉฐ, ํ ํฐ์ ์๋ช
๋ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋์นญ ์๋ช
๋ฐฉ์์ ์๋ ์๋ฆฌ
-
์๋ช
์์ฑ (ํ ํฐ ๋ฐํ ์)
- ์๋ฒ๋ ํค๋์ ํ์ด๋ก๋๋ฅผ ๊ฒฐํฉํฉ๋๋ค.
- ์ง์ ๋ ์๊ณ ๋ฆฌ์ฆ(HMAC SHA256 ๋ฑ)์ ์ฌ์ฉํ์ฌ ๋น๋ฐํค๋ก ์๋ช
์ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ์๋ช
์ ํค๋์ ํ์ด๋ก๋์ ์ถ๊ฐํ์ฌ ์ต์ข
JWT๋ฅผ ๋ง๋ญ๋๋ค.
-
์๋ช
๊ฒ์ฆ (ํ ํฐ ๊ฒ์ฆ ์)
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ํค๋, ํ์ด๋ก๋, ์๋ช
์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- ๊ฐ์ ๋น๋ฐํค๋ก ํค๋์ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช
์ ๋ค์ ์์ฑํฉ๋๋ค.
- ์๋ก ์์ฑํ ์๋ช
๊ณผ ํ ํฐ์ ํฌํจ๋ ์๋ช
์ ๋น๊ตํฉ๋๋ค.
- ์ผ์นํ๋ฉด: ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์์์ ํ์ธํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ผ์นํ์ง ์์ผ๋ฉด: ํ ํฐ์ด ๋ณ์กฐ๋์์์ ํ๋จํ๊ณ ์์ฒญ์ ๊ฑฐ๋ถํฉ๋๋ค.
๐ฏ ์์๋ก ์ดํดํ๊ธฐ
-
์๋ฒ์์ JWT ์์ฑ
-
ํค๋:
{
"alg": "HS256",
"typ": "JWT"
}
-
ํ์ด๋ก๋:
{
"sub": "user123",
"role": "admin"
}
-
๋น๋ฐํค: mysecretkey
-
์๋ช
์์ฑ:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
"mysecretkey"
)
-
์ต์ข
JWT:
header.payload.signature
-
ํด๋ผ์ด์ธํธ์ ์์ฒญ
- ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ์ ์ฅํ๊ณ , ์ดํ ์์ฒญ ์ ์ด ํ ํฐ์ ์๋ฒ์ ์ ์กํฉ๋๋ค.
-
์๋ฒ์์ JWT ๊ฒ์ฆ
- ์๋ฒ๋ ๋ฐ์ JWT๋ฅผ ๋ถ๋ฆฌํ์ฌ ํค๋์ ํ์ด๋ก๋๋ฅผ ์ถ์ถํฉ๋๋ค.
- ๋์ผํ ๋น๋ฐํค
mysecretkey๋ก ์๋ช
์ ๋ค์ ์์ฑํฉ๋๋ค.
- ์๋ก ์์ฑํ ์๋ช
๊ณผ ํ ํฐ์ ์๋ช
์ ๋น๊ตํ์ฌ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
โ๏ธ ๋์นญ ์๋ช
๋ฐฉ์์ ์ฅ๋จ์
์ฅ์
- ๊ตฌํ์ ๊ฐ๋จํจ: ๋น๋ฐํค ํ๋๋ง์ผ๋ก ์๋ช
์์ฑ๊ณผ ๊ฒ์ฆ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋น ๋ฅธ ์ฒ๋ฆฌ ์๋: ๋์นญ ์๊ณ ๋ฆฌ์ฆ์ ๋น๋์นญ์ ๋นํด ์ฐ์ฐ์ด ๋น ๋ฆ
๋๋ค.
๋จ์
- ๋น๋ฐํค ๊ด๋ฆฌ์ ์ด๋ ค์: ๋น๋ฐํค๊ฐ ๋
ธ์ถ๋๋ฉด ๋ณด์์ ํฐ ์ํ์ด ๋ฉ๋๋ค.
- ํ์ฅ์ฑ์ ํ๊ณ: ์ฌ๋ฌ ์๋ฒ๋ ์๋น์ค ๊ฐ์ ๋น๋ฐํค๋ฅผ ๊ณต์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ณด์ ์ํ์ด ์ฆ๊ฐํฉ๋๋ค.
๐ ๋น๋ฐํค ๊ด๋ฆฌ์ ์ค์์ฑ
๋์นญ ์๋ช
๋ฐฉ์์์ ๋น๋ฐํค๋ ์ ๋์ ์ผ๋ก ๋ณดํธ๋์ด์ผ ํ ์์์
๋๋ค.
- ์๋ฒ ๋ด๋ถ์์๋ง ์ ์ฅ: ๋น๋ฐํค๋ ์๋ฒ ๋ด ์์ ํ ๊ณต๊ฐ์ ์ ์ฅ๋๊ณ , ์ธ๋ถ์ ๋
ธ์ถ๋์ง ์์์ผ ํฉ๋๋ค.
- ์ ๊ทผ ์ ํ: ๋น๋ฐํค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์ต์ํ์ ์ธ์์๊ฒ๋ง ๋ถ์ฌํด์ผ ํฉ๋๋ค.
- ์ฃผ๊ธฐ์ ์ธ ๋ณ๊ฒฝ: ๋ณด์์ ๊ฐํํ๊ธฐ ์ํด ๋น๋ฐํค๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๐ก๏ธ ๋ณด์ ๊ณ ๋ ค์ฌํญ
- ๊ฐ๋ ฅํ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ: HMAC SHA256 ๋๋ ๊ทธ ์ด์์ ๊ฐ๋ ฅํ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ธ์.
- ํ ํฐ ๋ง๋ฃ ์๊ฐ ์ค์ : ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ์ค์ ํ์ฌ ๋ง๋ฃ๋ ํ ํฐ์ ์ฌ์ฉ์ ๋ฐฉ์งํฉ๋๋ค.
- HTTPS ์ฌ์ฉ: ํ ํฐ์ด ์ ์ก๋๋ ๋ชจ๋ ํต์ ์์ HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ๋์ฒญ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋น๋ฐํค ๋ณดํธ: ๋น๋ฐํค๋ ํ๊ฒฝ ๋ณ์๋ ์์ ํ ๋น๋ฐ ๊ด๋ฆฌ ์์คํ
์ ํตํด ๋ณดํธํฉ๋๋ค.
๐ ์ค์ ์ ์ฉ ์ฌ๋ก: ๋ก๊ทธ์ธ ํ๋ก์ธ์ค
-
์ฌ์ฉ์ ๋ก๊ทธ์ธ ์์ฒญ
- ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ์๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋
๋๋ค.
-
์๋ฒ์์ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ JWT ๋ฐ๊ธ
- ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ธ์ฆํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก JWT๋ฅผ ์์ฑํ๊ณ , ๋น๋ฐํค๋ก ์๋ช
ํฉ๋๋ค.
- ์์ฑ๋ JWT๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ผ๋ก ๋ณด๋
๋๋ค.
-
ํด๋ผ์ด์ธํธ์ JWT ์ ์ฅ ๋ฐ ์ฌ์ฉ
- ํด๋ผ์ด์ธํธ๋ ๋ฐ์ JWT๋ฅผ ๋ก์ปฌ ์ ์ฅ์๋ ์ฟ ํค์ ์ ์ฅํฉ๋๋ค.
- ์ดํ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค JWT๋ฅผ ํฌํจํ์ฌ ๋ณด๋
๋๋ค.
-
์๋ฒ์์ JWT ๊ฒ์ฆ ๋ฐ ์์ฒญ ์ฒ๋ฆฌ
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ JWT๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
- ์๋ช
์ด ์ ํจํ๋ค๋ฉด ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
๐ ์ง๊ธ ๋น์ฅ ์์์ผ ํ JWT์ ํ์ฉ ์๋๋ฆฌ์ค์ SSO ์์ ์ ๋ณต! ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฑ๊ธ ์ฌ์ธ์จ(SSO)๊ณผ์ ๊ด๊ณ์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ ๊ธ์ ํตํด JWT์ ์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ SSO์ ์๋ ๋ฐฉ์์ ์๋ฒฝํ๊ฒ ์ดํดํ์ค ์ ์์ ๊ฑฐ์์. ์ค๋น๋์
จ๋์? ๊ทธ๋ผ ์์ํฉ๋๋ค! ๐
๐ง JSON Web Token์ ์ฌ์ฉํด์ผ ํ ๋
JWT๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธ์ฆ๊ณผ ์ ๋ณด ๊ตํ์ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ์ค์
๋๋ค. ๊ทธ๋ ๋ค๋ฉด JWT๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ํฉ์ ์ธ์ ์ผ๊น์? ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ธ์ฆ (Authorization) ๐
JWT์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฐ๋ก ์ธ์ฆ์
๋๋ค. ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ํด๋น ์ฌ์ฉ์์๊ฒ JWT๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ์ดํ ์ฌ์ฉ์๋ ๊ฐ ์์ฒญ์ ์ด JWT๋ฅผ ํฌํจ์์ผ ์๋ฒ์ ์ ์กํฉ๋๋ค.
- ์ฌ์ฉ ๋ฐฉ๋ฒ: ํด๋ผ์ด์ธํธ๋
Authorization ํค๋์ JWT๋ฅผ ํฌํจํ์ฌ ์๋ฒ์ ์์ฒญ์ ๋ณด๋
๋๋ค.
- ์ฅ์ : ์๋ฒ๋ JWT๋ฅผ ๊ฒ์ฆํ์ฌ ์ฌ์ฉ์์ ์ ์์ ํ์ธํ๊ณ , ํด๋น ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฆฌ์์ค์ ๋ํ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
์ฑ๊ธ ์ฌ์ธ์จ(Single Sign-On, SSO)์์๋ JWT๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ JWT๊ฐ ์ค๋ฒํค๋๊ฐ ์ ๊ณ , ๋ค์ํ ๋๋ฉ์ธ์์ ์ฝ๊ฒ ์ฌ์ฉ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
JWT๋ ๋น์ฌ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์ ์กํ๋ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค.
- ์ ๋ขฐ์ฑ ํ๋ณด: JWT๋ ๊ณต๊ฐ/๊ฐ์ธ ํค ์์ ์ฌ์ฉํด ์๋ช
๋ ์ ์์ผ๋ฏ๋ก, ๋ณด๋ธ ์ฌ๋์ด ์ค์ ๋ก ์ฃผ์ฅํ๋ ๋น์ฌ์์์ ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ: ์๋ช
์ด ํค๋์ ํ์ด๋ก๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์, ๋ด์ฉ์ด ๋ณ์กฐ๋์ง ์์์์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
์ด๋ฌํ ํน์ฑ ๋๋ถ์ JWT๋ ์์ ํ ์ ๋ณด ๊ตํ ์๋จ์ผ๋ก ๊ฐ๊ด๋ฐ๊ณ ์์ต๋๋ค.
๐ ์ฑ๊ธ ์ฌ์ธ์จ(SSO) ์๋ฒฝ ์ดํดํ๊ธฐ
์ด์ JWT์ ํ์ฉ ์ฌ๋ก ์ค ํ๋์ธ ์ฑ๊ธ ์ฌ์ธ์จ(SSO)์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
SSO๋ ๋ฌด์์ธ๊ฐ์? ๐ค
์ฑ๊ธ ์ฌ์ธ์จ(Single Sign-On, SSO)์ ์ฌ์ฉ์๊ฐ ํ ๋ฒ์ ๋ก๊ทธ์ธ์ผ๋ก ์ฌ๋ฌ ์์คํ
์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์๋์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ์ธ์ฆ ๋ฐฉ์์
๋๋ค.
- ํต์ฌ ๊ฐ๋
: ํ ๋ฒ ์ธ์ฆํ๋ฉด ์ถ๊ฐ ๋ก๊ทธ์ธ ์์ด๋ ๊ด๋ จ๋ ๋ชจ๋ ์๋น์ค์ ์ ๊ทผ ๊ฐ๋ฅ
- ์ฌ์ฉ ์์: ๊ตฌ๊ธ ๊ณ์ ํ๋๋ก ์ง๋ฉ์ผ, ๊ตฌ๊ธ ๋๋ผ์ด๋ธ, ์ ํ๋ธ ๋ฑ ์ฌ๋ฌ ์๋น์ค ์ด์ฉ
๐ฏ SSO์ ์๋ ๋ฐฉ์ ์์๋ก ์ดํดํ๊ธฐ
- ์ด๊ธฐ ๋ก๊ทธ์ธ: ์ฌ์ฉ์๊ฐ ํ์ฌ์ ์ด๋ฉ์ผ ์์คํ
์ ๋ก๊ทธ์ธํฉ๋๋ค.
- ์ธ์ฆ ํ ํฐ ์์ฑ: ์๋ฒ๋ ์ฌ์ฉ์์๊ฒ ์ธ์ฆ ํ ํฐ(JWT ๋ฑ)์ ๋ฐ๊ธํฉ๋๋ค.
- ๋ค๋ฅธ ์๋น์ค ์ ๊ทผ: ์ฌ์ฉ์๊ฐ ์ฌ๋ด ๋ฉ์ ์ , ํ์ผ ๊ณต์ ์์คํ
๋ฑ์ ์ ๊ทผํ ๋ ์ด ํ ํฐ์ ์ฌ์ฉํฉ๋๋ค.
- ์๋ ์ธ์ฆ: ๊ฐ ์๋น์ค๋ ํ ํฐ์ ๊ฒ์ฆํ์ฌ ์ถ๊ฐ ๋ก๊ทธ์ธ ์์ด๋ ์ ๊ทผ์ ํ์ฉํฉ๋๋ค.
๐ ๏ธ SSO์ ์๋ ์๋ฆฌ
- ์ค์ ์ธ์ฆ ์๋ฒ: ๋ชจ๋ ์ธ์ฆ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค์ ์๋ฒ๊ฐ ์์ต๋๋ค.
- ์ธ์ฆ ํ ํฐ ์ฌ์ฉ: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์ค์ ์๋ฒ๋ ์ธ์ฆ ํ ํฐ์ ์์ฑํฉ๋๋ค.
- ์๋น์ค ๊ฐ ํ ํฐ ๊ณต์ : ๊ฐ ์๋น์ค๋ ์ด ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ ์์ ํ์ธํฉ๋๋ค.
๐ช SSO์ ์ฅ์
- ์ฌ์ฉ์ ํธ์์ฑ ํฅ์: ์ฌ๋ฌ ๋ฒ ๋ก๊ทธ์ธํ ํ์ ์์ด ํ ๋ฒ์ ๋ก๊ทธ์ธ์ผ๋ก ๋ชจ๋ ์๋น์ค ์ด์ฉ ๊ฐ๋ฅ
- ๋ณด์ ๊ฐํ: ์ค์์์ ์ธ์ฆ์ ๊ด๋ฆฌํ๋ฏ๋ก ์ผ๊ด๋ ๋ณด์ ์ ์ฑ
์ ์ฉ ๊ฐ๋ฅ
- ๊ด๋ฆฌ ํจ์จ์ฑ ์ฆ๊ฐ: IT ๊ด๋ฆฌ์๋ ๊ณ์ ๊ณผ ์ ๊ทผ ๊ถํ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
โ ๏ธ SSO์ ๋จ์
- ๋ณด์ ์ํ์ฑ: ํ๋์ ์ธ์ฆ ์ ๋ณด๊ฐ ์ฌ๋ฌ ์๋น์ค์ ์ฐ๊ฒฐ๋๋ฏ๋ก, ๋ง์ฝ ์ด ์ ๋ณด๊ฐ ํ์ทจ๋๋ฉด ํฐ ์ํ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๊ตฌํ ๋ณต์ก์ฑ: ์์คํ
๊ฐ ์ฐ๋๊ณผ ์ด๊ธฐ ์ค์ ์ด ๋ณต์กํ ์ ์์ต๋๋ค.
๐ JWT์ SSO์ ๊ด๊ณ
SSO ์์คํ
์์ JWT๋ ์ธ์ฆ ํ ํฐ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ค์ ์ธ์ฆ ์๋ฒ๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด JWT๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
- ๊ฐ ์๋น์ค ์ ๊ณต์๋ ์ด JWT๋ฅผ ๋ฐ์ ์ฌ์ฉ์์ ์ ์์ ๊ฒ์ฆํฉ๋๋ค.
- JWT์ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ๊ณผ ์ ๋ขฐ์ฑ ๋๋ถ์ ์์ ํ SSO ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ ์ ๋ฆฌํ๋ฉฐ
์ค๋์ JWT์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก์ SSO์์์ ํ์ฉ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์์ต๋๋ค.
- JWT๋ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น์?
- ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ
- ๋น์ฌ์ ๊ฐ ์์ ํ ์ ๋ณด ๊ตํ์ด ํ์ํ ๊ฒฝ์ฐ
- SSO๋ ๋ฌด์์ธ๊ฐ์?
- ํ ๋ฒ์ ๋ก๊ทธ์ธ์ผ๋ก ์ฌ๋ฌ ์๋น์ค์ ์ ๊ทผํ ์ ์๋ ์ธ์ฆ ๋ฐฉ์
- ์ฌ์ฉ์ ํธ์์ฑ๊ณผ ๊ด๋ฆฌ ํจ์จ์ฑ์ ๋์ฌ์ค
- JWT์ SSO์ ๊ด๊ณ๋?
- JWT๋ SSO์์ ์ธ์ฆ ํ ํฐ์ผ๋ก ์ฌ์ฉ๋์ด ์์ ํ๊ณ ํจ์จ์ ์ธ ์ธ์ฆ์ ๊ฐ๋ฅํ๊ฒ ํจ
์ด์ JWT์ SSO์ ๋ํ ์ดํด๊ฐ ๋์ฑ ๊น์ด์ง์
จ์ ๊ฒ์
๋๋ค. ์ค์ ํ๋ก์ ํธ์์ JWT์ SSO๋ฅผ ํ์ฉํ์ฌ ๋ณด๋ค ์์ ํ๊ณ ํจ์จ์ ์ธ ์ธ์ฆ ์์คํ
์ ๊ตฌ์ถํด๋ณด์ธ์! ๐
๐ ๏ธ ์๋ฒฝ ์ ๋ณต! JWT์ ๊ตฌ์กฐ๋ฅผ ํ๋์ ์ดํดํ๊ธฐ ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ ๊ตฌ์กฐ์ ๋ํด ๊น์ด ์๊ฒ ํํค์ณ ๋ณด๋ ค๊ณ ํฉ๋๋ค. JWT๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๋ฅผ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์๋๋ฐ์, ๊ทธ ๊ตฌ์กฐ๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ๋ฉด ๋ณด์๊ณผ ํจ์จ์ฑ์ ๋ชจ๋ ์ก์ ์ ์์ต๋๋ค. ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ฆ JWT์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
JWT๋ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค:
- ํค๋(Header)
- ํ์ด๋ก๋(Payload)
- ์๋ช
(Signature)
์ด๋ฌํ ๊ตฌ์กฐ ๋๋ถ์ JWT๋ ๊ฐ๊ฒฐํ๊ณ ์ ์กํ๊ธฐ ์ฝ๊ณ , ๊ฒ์ฆ๋ ๊ฐํธํฉ๋๋ค.
ํค๋๋ ํ ํฐ์ ๋ํ ๊ธฐ๋ณธ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
- ํ ํฐ ์ ํ: ๋ณดํต
"JWT"๋ก ์ง์ ๋ฉ๋๋ค.
- ์๋ช
์๊ณ ๋ฆฌ์ฆ:
HMAC SHA256์ด๋ RSA ๋ฑ ์ฌ์ฉ๋ ์๋ช
์๊ณ ๋ฆฌ์ฆ์ ๋ํ๋
๋๋ค.
๐ ํค๋์ ์์
{
"alg": "HS256",
"typ": "JWT"
}
- ์ด JSON ๊ฐ์ฒด๋ Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด JWT์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์ ํ์ฑํฉ๋๋ค.
2๏ธโฃ ํ์ด๋ก๋(Payload): ์ค์ ๋ด๊ณ ์ถ์ ๋ฐ์ดํฐ
ํ์ด๋ก๋์๋ ํด๋ ์(Claims)์ด ํฌํจ๋๋ฉฐ, ์ด๋ ์ฌ์ฉ์ ๋๋ ์ํฐํฐ์ ๋ํ ์ ๋ณด์
๋๋ค.
ํด๋ ์์ ์ข
๋ฅ
-
๋ฑ๋ก๋ ํด๋ ์ (Registered Claims)
- ํ์คํ๋ ํด๋ ์์ผ๋ก, ํ ํฐ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์:
iss (๋ฐ๊ธ์), exp (๋ง๋ฃ ์๊ฐ), sub (์ฃผ์ )
-
๊ณต๊ฐ ํด๋ ์ (Public Claims)
- ์ฌ์ฉ์ ์ ์ ํด๋ ์์ผ๋ก, ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด URI ํ์์ ๊ณ ์ ํ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
-
๋น๊ณต๊ฐ ํด๋ ์ (Private Claims)
- ๋น์ฌ์ ๊ฐ์ ํ์๋ ํด๋ ์์ผ๋ก, ์๋ฅผ ๋ค์ด
userId, roles ๋ฑ
๐ ํ์ด๋ก๋์ ์์
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
- ์ด JSON ๊ฐ์ฒด๋ Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ํ์ฑํฉ๋๋ค.
3๏ธโฃ ์๋ช
(Signature): ํ ํฐ์ ์ ๋ขฐ์ฑ ํ๋ณด
์๋ช
์ ํ ํฐ์ด ๋ณ์กฐ๋์ง ์์์์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ช
์์ฑ ๋ฐฉ๋ฒ
- ์๋ช
์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น๋ฐํค๋ฅผ ์ฌ์ฉํ์ฌ ์๋ช
์ ์์ฑํฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ HMAC SHA256 ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ:
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
- ์ฌ๊ธฐ์
secret์ ์๋ฒ๋ง ์๊ณ ์๋ ๋น๋ฐํค์
๋๋ค.
๐ ์๋ช
์ ์ญํ
- ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ: ํค๋์ ํ์ด๋ก๋๊ฐ ๋ณ๊ฒฝ๋์ง ์์์์ ํ์ธ
- ์ธ์ฆ: ํ ํฐ์ด ์ ๋ขฐํ ์ ์๋ ๋ฐ๊ธ์์ ์ํด ์์ฑ๋์์์ ๋ณด์ฅ
๐ JWT ์ ์ฒด ๊ตฌ์กฐ ์์
์ต์ข
JWT๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๊ฐ์ต๋๋ค:
xxxxx.yyyyy.zzzzz
xxxxx : Base64Url ์ธ์ฝ๋ฉ๋ ํค๋
yyyyy : Base64Url ์ธ์ฝ๋ฉ๋ ํ์ด๋ก๋
zzzzz : Base64Url ์ธ์ฝ๋ฉ๋ ์๋ช
๐ ์์๋ก ๋ณด๋ JWT
-
ํค๋(Base64Url ์ธ์ฝ๋ฉ ์ )
{
"alg": "HS256",
"typ": "JWT"
}
-
ํ์ด๋ก๋(Base64Url ์ธ์ฝ๋ฉ ์ )
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
-
Base64Url ์ธ์ฝ๋ฉ ํ
- ํค๋:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- ํ์ด๋ก๋:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
-
์๋ช
์์ฑ
HMACSHA256(
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9",
"secret"
)
-
์ต์ข
JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
๐ JWT์ ์๋ ์๋ฆฌ ํ๋์ ๋ณด๊ธฐ
-
ํด๋ผ์ด์ธํธ ์ธ์ฆ ์์ฒญ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์กํฉ๋๋ค.
-
์๋ฒ์์ JWT ์์ฑ
- ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ ํ, ํค๋์ ํ์ด๋ก๋๋ฅผ ์์ฑํฉ๋๋ค.
- ๋น๋ฐํค๋ก ์๋ช
์ ์์ฑํ์ฌ JWT๋ฅผ ์์ฑํฉ๋๋ค.
- ์ด JWT๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ์ JWT ์ ์ฅ ๋ฐ ์ฌ์ฉ
- ํด๋ผ์ด์ธํธ๋ JWT๋ฅผ ์์ ํ ์ฅ์์ ์ ์ฅํฉ๋๋ค.
- ์ดํ ์์ฒญ ์๋ง๋ค JWT๋ฅผ ํฌํจํ์ฌ ์๋ฒ์ ์ ์กํฉ๋๋ค.
-
์๋ฒ์์ JWT ๊ฒ์ฆ
- ์๋ฒ๋ ๋ฐ์ JWT๋ฅผ ํค๋, ํ์ด๋ก๋, ์๋ช
์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- ํค๋์ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํด ์๋ช
์ ๋ค์ ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ์๋ช
๊ณผ JWT์ ์๋ช
์ ๋น๊ตํ์ฌ ์ ํจ์ฑ์ ํ์ธํฉ๋๋ค.
๐ ๋ณด์์ ๋ํ ๊ณ ๋ ค์ฌํญ
๐ ํ ๋ฒ์ ์ดํดํ๋ JWT ํ์ด๋ก๋์ ํด๋ ์์ ๋ชจ๋ ๊ฒ! ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ ํ์ด๋ก๋(Payload) ๋ถ๋ถ๊ณผ ๊ทธ ์์ ๋ด๊ธฐ๋ ํด๋ ์(Claims)์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. JWT๋ฅผ ์ฌ์ฉํ ๋ ํ์ด๋ก๋์ ์ด๋ค ์ ๋ณด๋ฅผ ๋ด์์ผ ํ๋์ง, ํด๋ ์์ ์ข
๋ฅ์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊น์ง ๋ชจ๋ ์ ๋ฆฌํด๋๋ฆด๊ฒ์. ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ฆ ํ์ด๋ก๋(Payload)๋?
ํ์ด๋ก๋๋ JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก, ํ ํฐ์ ๋ด๊ธฐ๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ํด๋ ์(Claims)์ด ๋ด๊ธฐ๋๋ฐ, ํด๋ ์์ ํน์ ์ํฐํฐ(์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์)์ ๋ํ ์ง์ ์ด๋ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
๐ง ํด๋ ์์ ์ธ ๊ฐ์ง ์ ํ
ํด๋ ์์ ๋ค์ ์ธ ๊ฐ์ง ์ ํ์ผ๋ก ๋๋ฉ๋๋ค:
- ๋ฑ๋ก๋ ํด๋ ์ (Registered Claims)
- ๊ณต๊ฐ ํด๋ ์ (Public Claims)
- ๋น๊ณต๊ฐ ํด๋ ์ (Private Claims)
1๏ธโฃ ๋ฑ๋ก๋ ํด๋ ์ (Registered Claims)
- ์ค๋ช
: JWT ํ์ค์์ ๋ฏธ๋ฆฌ ์ ์๋ ํด๋ ์์ผ๋ก, ํ ํฐ์ ์ ์ฉ์ฑ๊ณผ ์ํธ ์ด์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด ๊ถ์ฅ๋ฉ๋๋ค.
- ์์ ํด๋ ์:
iss (๋ฐ๊ธ์)
exp (๋ง๋ฃ ์๊ฐ)
sub (์ฃผ์ )
aud (๋์)
- ํน์ง: ํด๋ ์ ์ด๋ฆ์ด ๋ชจ๋ ์ธ ๊ธ์์ธ ์ด์ ๋ JWT๊ฐ ๊ฐ๊ฒฐํ๊ฒ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์
๋๋ค.
2๏ธโฃ ๊ณต๊ฐ ํด๋ ์ (Public Claims)
- ์ค๋ช
: JWT ์ฌ์ฉ์๋ค์ด ์์๋ก ์ ์ํ ์ ์๋ ํด๋ ์์
๋๋ค.
- ์ฃผ์์ฌํญ: ์ด๋ฆ ์ถฉ๋์ ํผํ๊ธฐ ์ํด IANA JSON Web Token Registry์ ๋ฑ๋กํ๊ฑฐ๋, ๊ณ ์ ํ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ง URI ํํ๋ก ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ํฌํจํ ์ ์๋ ์ ๋ณด ์์:
- ์ ํ๋ฆฌ์ผ์ด์
๋ณ ์ ๋ณด
- ์ฌ์ฉ์ ์ค์ , ํ๊ฒฝ ์ ๋ณด ๋ฑ
- ์:
https://yourapp.com/claims/preference
- ํ์ฌ ๋๋ ์กฐ์ง ์ ๋ณด
- ๋ถ์, ์ง์ฑ
๋ฑ ์กฐ์ง ๋ด๋ถ ๊ณตํต ์ ๋ณด
- ์:
https://yourcompany.com/claims/department
- ์ ๊ทผ ๋ ๋ฒจ ๋๋ ๊ถํ ๊ด๋ จ ์ ๋ณด
- ์ฌ์ฉ์ ์ญํ , ๊ถํ ์์ค ๋ฑ
- ์:
https://yourapp.com/claims/role
3๏ธโฃ ๋น๊ณต๊ฐ ํด๋ ์ (Private Claims)
- ์ค๋ช
: ๋ฑ๋ก๋์ง ์์๊ณ ๊ณต๊ฐ๋์ง ์์, ๋น์ฌ์ ๊ฐ์ ์ ๋ณด ๊ณต์ ๋ฅผ ์ํด ๋ง์ถค ์ ์๋ ํด๋ ์์
๋๋ค.
- ํฌํจํ ์ ์๋ ์ ๋ณด ์์:
- ์ฌ์ฉ์ ID
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ๊ณ ์ ID
- ์:
"userId": "abc123"
- ์ธ์
์ ๋ณด
- ์ธ์
์ํ, ํน์ ์์ฒญ ๊ด๋ จ ์ ๋ณด
- ์:
"sessionId": "xyz789"
- ๊ฐ์ธ ์ ๋ณด
- ์ด๋ฆ, ์ด๋ฉ์ผ, ์ ํ๋ฒํธ ๋ฑ ๊ฐ์ธ ์๋ณ ์ ๋ณด(PII)
- ์:
"email": "user@example.com"
- ์ธ์ฆ ๊ด๋ จ ์ ๋ณด
- ์ธ์ฆ ์ํ, ๋น๋ฐ๋ฒํธ ๋ง๋ฃ ์ฌ๋ถ ๋ฑ ๋ฏผ๊ฐํ ์ ๋ณด
- ์:
"passwordExpired": false
๐ ํ์ด๋ก๋ ์์
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"https://yourapp.com/claims/role": "admin",
"userId": "abc123",
"sessionId": "xyz789"
}
- ๋ฑ๋ก๋ ํด๋ ์:
sub, name, admin
- ๊ณต๊ฐ ํด๋ ์:
https://yourapp.com/claims/role
- ๋น๊ณต๊ฐ ํด๋ ์:
userId, sessionId
์ด ํ์ด๋ก๋๋ Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด JWT์ ๋ ๋ฒ์งธ ๋ถ๋ถ์ ๊ตฌ์ฑํฉ๋๋ค.
๐ ๋ณด์ ๊ณ ๋ ค์ฌํญ
- ์ ๋ณด ๋
ธ์ถ ์ํ: ์๋ช
๋ ํ ํฐ์ ๊ฒฝ์ฐ ๋ณ์กฐ๋ ๋ฐฉ์ง๋์ง๋ง, ๋๊ตฌ๋ ํ์ด๋ก๋์ ๋ด์ฉ์ ์ฝ์ ์ ์์ต๋๋ค.
- ๋น๋ฐ ์ ๋ณด ์ฒ๋ฆฌ: ํ์ด๋ก๋๋ ํค๋์ ๋น๋ฐ ์ ๋ณด๋ฅผ ํฌํจํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์ํธํ ํ์์ฑ: ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํ๋ค๋ฉด, JWT๋ฅผ ์ํธํํ์ฌ ์ ์กํด์ผ ํฉ๋๋ค.
โ ๏ธ ํด๋ ์ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ๊ณต๊ฐ ํด๋ ์์ ๋ค์ด๋ฐ: ์ด๋ฆ ์ถฉ๋์ ํผํ๊ธฐ ์ํด ๊ณ ์ ํ URI ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋น๊ณต๊ฐ ํด๋ ์์ ๋ณด์: ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ฐ๋์ ์ํธํํ๊ฑฐ๋ ํฌํจํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ํ ํฐ ํฌ๊ธฐ ๊ด๋ฆฌ: ํ์ด๋ก๋์ ๋๋ฌด ๋ง์ ์ ๋ณด๋ฅผ ๋ด์ผ๋ฉด ํ ํฐ ํฌ๊ธฐ๊ฐ ์ปค์ ธ ์ ์ก ํจ์จ์ด ๋จ์ด์ง๋๋ค.
- ๋ง๋ฃ ์๊ฐ ์ค์ :
exp ํด๋ ์์ ์ฌ์ฉํ์ฌ ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ๋ช
์ํ์ธ์.
๐ JWT์ ๋ง์ง๋ง ํผ์ฆ ์กฐ๊ฐ: ์๋ช
(Signature) ์๋ฒฝ ์ดํดํ๊ธฐ! ๐งฉ
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ ํต์ฌ ์ค ํ๋์ธ ์๋ช
(Signature)์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค. JWT์ ์๋ช
์ ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ์ค์ํ ์์์ธ๋ฐ์, ์ด๋ป๊ฒ ์์ฑ๋๊ณ ์ฌ์ฉ๋๋์ง ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐๏ธ ์๋ช
(Signature)์ด๋?
์๋ช
(Signature)์ JWT์ ์ธ ๋ฒ์งธ ๋ถ๋ถ์ผ๋ก, ํ ํฐ์ด ์ ์ก ์ค์ ๋ณ๊ฒฝ๋์ง ์์์์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ, ๊ฐ์ธ ํค๋ก ์๋ช
๋ ํ ํฐ์ ๊ฒฝ์ฐ ๋ฐ์ ์์ ์ ์์ ๊ฒ์ฆํ ์๋ ์์ต๋๋ค.
์๋ช
์ ์ญํ
- ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ: ํค๋์ ํ์ด๋ก๋๊ฐ ๋ณ๊ฒฝ๋์ง ์์์์ ํ์ธ
- ์ธ์ฆ: ํ ํฐ ๋ฐํ์๊ฐ ์ ๋ขฐํ ์ ์๋์ง ๊ฒ์ฆ
๐ ๏ธ ์๋ช
์์ฑ ๋ฐฉ๋ฒ
์๋ช
์ ์์ฑํ๋ ค๋ฉด ๋ค์ ์์๊ฐ ํ์ํฉ๋๋ค:
- ์ธ์ฝ๋ฉ๋ ํค๋
- ์ธ์ฝ๋ฉ๋ ํ์ด๋ก๋
- ๋น๋ฐํค ๋๋ ๊ฐ์ธ ํค
- ์๋ช
์๊ณ ๋ฆฌ์ฆ (ํค๋์ ์ง์ ๋จ)
HMAC SHA256 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์๋ช
์์ฑ ์์
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
base64UrlEncode(header): ํค๋๋ฅผ Base64Url๋ก ์ธ์ฝ๋ฉ
base64UrlEncode(payload): ํ์ด๋ก๋๋ฅผ Base64Url๋ก ์ธ์ฝ๋ฉ
secret: ์๋ฒ๋ง ์๊ณ ์๋ ๋น๋ฐํค
๐ ํฌ์ธํธ
- ๋น๋ฐํค ๊ด๋ฆฌ: ๋น๋ฐํค๋ ์๋ฒ์์ ์์ ํ๊ฒ ๊ด๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ ์ผ์น: ํ ํฐ ์์ฑ๊ณผ ๊ฒ์ฆ ์ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด ๋์ผํด์ผ ํฉ๋๋ค.
๐ ๋ชจ๋ ๋ถ๋ถ์ ํฉ์ณ์ ์ต์ข
JWT ๋ง๋ค๊ธฐ
JWT๋ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ํค๋(Header)
- ํ์ด๋ก๋(Payload)
- ์๋ช
(Signature)
๊ฐ ๋ถ๋ถ์ Base64Url ์ธ์ฝ๋ฉ๋์ด JWT๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ต์ข
JWT ํ์
xxxxx.yyyyy.zzzzz
xxxxx: ์ธ์ฝ๋ฉ๋ ํค๋
yyyyy: ์ธ์ฝ๋ฉ๋ ํ์ด๋ก๋
zzzzz: ์ธ์ฝ๋ฉ๋ ์๋ช
๐ JWT์ ๊ฐ๊ฒฐํจ๊ณผ ํจ์จ์ฑ
- ๊ฐ๊ฒฐํ ํํ: XML ๊ธฐ๋ฐ์ SAML ํ ํฐ์ ๋นํด ํจ์ฌ ์งง๊ณ ๊ฐ๊ฒฐํฉ๋๋ค.
- ์ ์ก ์ฉ์ด์ฑ: HTML๊ณผ HTTP ํ๊ฒฝ์์ ์ฝ๊ฒ ์ ๋ฌ ๊ฐ๋ฅํฉ๋๋ค.
๐ฏ ์ค์ ์์๋ก ์ดํดํ๊ธฐ
-
ํค๋
{
"alg": "HS256",
"typ": "JWT"
}
-
ํ์ด๋ก๋
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
-
์ธ์ฝ๋ฉ๋ ํค๋์ ํ์ด๋ก๋
- ํค๋:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- ํ์ด๋ก๋:
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
-
์๋ช
์์ฑ
HMACSHA256(
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9",
"your-256-bit-secret"
)
-
์ธ์ฝ๋ฉ๋ ์๋ช
- ์๋ช
:
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
-
์ต์ข
JWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
๐งช ์ง์ ์ค์ตํด๋ณด๊ธฐ
JWT์ ๊ตฌ์กฐ์ ์๋ช
๊ณผ์ ์ ๋ ๊น์ด ์ดํดํ๊ณ ์ถ๋ค๋ฉด jwt.io Debugger๋ฅผ ํ์ฉํด๋ณด์ธ์!
- ํ ํฐ ๋์ฝ๋ฉ: JWT๋ฅผ ๋ณต์ฌํ์ฌ ๋์ฝ๋ฉ๋ ํค๋์ ํ์ด๋ก๋๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ํ ํฐ ๊ฒ์ฆ: ์๋ช
๊ณผ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ ํ์ฌ ํ ํฐ์ ์ ํจ์ฑ์ ๊ฒ์ฆํด๋ณผ ์ ์์ต๋๋ค.
- ํ ํฐ ์์ฑ: ์ปค์คํ
ํค๋์ ํ์ด๋ก๋๋ก ์ง์ JWT๋ฅผ ์์ฑํด๋ณด์ธ์.
๐ ๋ณด์์ ๋ํ ์ถ๊ฐ ๊ณ ๋ ค์ฌํญ
- ๋น๋ฐํค ๋ณดํธ: ๋น๋ฐํค๋ ์ ๋ ์ธ๋ถ์ ๋
ธ์ถ๋์ด์๋ ์ ๋ฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ ๊ณต๊ฒฉ ๋ฐฉ์ง: ์๋ฒ๋ ํ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๊ณ ,
none ์๊ณ ๋ฆฌ์ฆ์ ๊ฑฐ๋ถํด์ผ ํฉ๋๋ค.
- HTTPS ์ฌ์ฉ: ํ ํฐ์ด ์ ์ก๋๋ ๋ชจ๋ ํต์ ์์ HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ํ ํฐ ๋ฌดํจํ ์ ๋ต: ๋น๋ฐํค๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณ๊ฒฝํ๊ฑฐ๋, ํ ํฐ ๋ธ๋๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ์ฌ ๋ณด์์ ๊ฐํํฉ๋๋ค.
๐ ํ๋์ ์ดํดํ๋ JWT์ ์๋ ์๋ฆฌ์ ์ธ์ฆ ๊ณผ์ ! ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ธ์ฆ ๊ณผ์ ์์ JWT๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. JWT๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฌด์ํ ์ธ์ฆ์ ๊ตฌํํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋๋ฐ์, ๊ทธ ์๋ฆฌ์ ์ค์ ์ ์ฉ ๋ฐฉ๋ฒ์ ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ง JWT๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์๋ํ๋์?
JSON Web Token(JWT)์ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์กํ๊ธฐ ์ํ ๊ฐ๋ฐฉํ ํ์ค(RFC 7519)์
๋๋ค. ์ธ์ฆ ๊ณผ์ ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด, ์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ ์ ์๋ JWT๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ์ด ํ ํฐ์ ์ดํ ์์ฒญ์์ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช
์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์๋ฒ๋ ์ด ํ ํฐ์ ๊ฒ์ฆํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ JWT ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ๋ณด์ ๋ฌธ์ ๋ฐฉ์ง: JWT๋ ์๊ฒฉ ์ฆ๋ช
์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ํ ํฐ์ ์๋ช
๊ด๋ฆฌ: ํ์ํ ๊ธฐ๊ฐ ์ด์์ผ๋ก ํ ํฐ์ ๋ณด๊ดํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์ ์ฅ ๊ธ์ง: ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ์์ ๋ฏผ๊ฐํ ์ธ์
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๐ก JWT๋ฅผ ์ฌ์ฉํ ์ธ์ฆ ๊ณผ์ ์์ธํ ๋ณด๊ธฐ
1๏ธโฃ ์ฌ์ฉ์๊ฐ ๋ณดํธ๋ ๊ฒฝ๋ก๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ณ ์ ํ ๋
- ๋ณดํธ๋ ๊ฒฝ๋ก ๋๋ ๋ฆฌ์์ค๋ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ์ ๊ทผํ ์ ์๋ ํ์ด์ง๋ API ์๋ํฌ์ธํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ง์ดํ์ด์ง, ๊ด๋ฆฌ์ ํ์ด์ง, ํน์ ๊ธฐ๋ฅ ๋ฑ์ด ์ด์ ํด๋นํฉ๋๋ค.
2๏ธโฃ ์ฌ์ฉ์ ์์ด์ ํธ๋ Authorization ํค๋์ JWT๋ฅผ ํฌํจํ์ฌ ์ ์ก
3๏ธโฃ ์๋ฒ๊ฐ Authorization ํค๋์ ์๋ ์ ํจํ JWT๋ฅผ ํ์ธ
- ์๋ฒ๋ ์์ฒญ์
Authorization ํค๋์์ JWT๋ฅผ ์ถ์ถํฉ๋๋ค.
- JWT ๊ฒ์ฆ ์ ์ฐจ:
- ์๋ช
๊ฒ์ฆ: ํ ํฐ์ด ์์กฐ๋๊ฑฐ๋ ๋ณ์กฐ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
- ๋ง๋ฃ ์๊ฐ ํ์ธ: ํ ํฐ์ด ๋ง๋ฃ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
- ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์ฆ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
4๏ธโฃ ๋ฌด์ํ(stateless) ์ธ์ฆ ๋ฉ์ปค๋์ฆ
- JWT๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๋ ์ธ์
์ ๋ณด๋ฅผ ์ ์งํ์ง ์๊ณ ๋ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ ์ ์์ต๋๋ค.
- ๋ฌด์ํ๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ์ง ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๊ฐ ์์ฒญ์ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ๋งค๋ฒ JWT๋ฅผ ํตํด ์ธ์ฆํฉ๋๋ค.
5๏ธโฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ค์ผ ์ ์์
- JWT์๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ด, ์๋ฒ๊ฐ ๋งค๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ง ์์๋ ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, JWT์ ์ฌ์ฉ์์ ์ญํ (role) ์ ๋ณด๊ฐ ์๋ค๋ฉด, ์๋ฒ๋ ์ด๋ฅผ ํ ๋๋ก ๊ถํ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
- ํ์ง๋ง ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๋ฐ์ดํฐ๋ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
๐ CORS ๋ฌธ์ ์์ด JWT ์ฌ์ฉํ๊ธฐ
1๏ธโฃ CORS๋ ๋ฌด์์ธ๊ฐ์?
- CORS(Cross-Origin Resource Sharing)๋ ์๋ก ๋ค๋ฅธ ์ถ์ฒ(origin) ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๊ด๋ฆฌํ๋ ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ
์
๋๋ค.
- ์ถ์ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ ํฌํธ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ๋ฐ์ํ๋ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
2๏ธโฃ ์ฟ ํค์ CORS ๋ฌธ์
- ์ฟ ํค๋ฅผ ํฌํจํ ์์ฒญ์ CORS ์ ์ฑ
์ ์ ์ฝ์ ๋ฐ์ต๋๋ค.
- ๋ค๋ฅธ ์ถ์ฒ๋ก ์ฟ ํค๋ฅผ ์ ์กํ๋ ค๋ฉด ์๋ฒ์์ CORS ์ค์ ์ ๋ช
์์ ์ผ๋ก ํ์ฉํด์ผ ํฉ๋๋ค.
3๏ธโฃ Authorization ํค๋์ ํ ํฐ์ ๋ด์ ์ ์กํ๋ ๊ฒฝ์ฐ
- JWT๋ฅผ Authorization ํค๋์ ๋ด์ ์ ์กํ๋ฉด ์ฟ ํค๊ฐ ์๋๋ฏ๋ก CORS ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ Authorization ํค๋์ ๋ด๊ธด JWT๋ฅผ ์ผ๋ฐ ํค๋๋ก ์ทจ๊ธํ์ฌ ๋ณ๋์ CORS ์ค์ ์์ด๋ ์์ฒญ์ ๋ณด๋
๋๋ค.
โ
์์ฝ
- JWT๋ฅผ Authorization ํค๋์ ๋ด์ ์ ์กํ๋ฉด CORS ๋ฌธ์ ์์ด ๋ค์ํ ์ถ์ฒ์์ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
๐ JWT ์์ฑ๋ถํฐ ๋ฆฌ์์ค ์ ๊ทผ๊น์ง์ ๊ณผ์
1๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์
๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธ๊ฐ ์๋ฒ์ ์ ๊ทผ ๊ถํ์ ์์ฒญ
- ์ ํ๋ฆฌ์ผ์ด์
๋๋ ํด๋ผ์ด์ธํธ: ์น ์ฑ, ๋ชจ๋ฐ์ผ ์ฑ, API ํด๋ผ์ด์ธํธ ๋ฑ
- ์ธ๊ฐ ์๋ฒ(Authorization Server): ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ํ ํฐ ๋ฐ๊ธ์ ๋ด๋น
- ์ธ๊ฐ ํ๋ฆ(Authorization Flow):
2๏ธโฃ ์ธ๊ฐ๊ฐ ์น์ธ๋๋ฉด, ์ธ๊ฐ ์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ก์ธ์ค ํ ํฐ์ ๋ฐํ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ธ๊ฐ ์๋ฒ๋ ์ก์ธ์ค ํ ํฐ(Access Token)์ ๋ฐ๊ธํฉ๋๋ค.
- ์ด ํ ํฐ์ ์ผ๋ฐ์ ์ผ๋ก JWT ํ์์ด๋ฉฐ, ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
3๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํด ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผ
โ
์์ฝ
- ์ธ๊ฐ ์์ฒญ: ํด๋ผ์ด์ธํธ โ ์ธ๊ฐ ์๋ฒ (๋ก๊ทธ์ธ ์์ฒญ)
- ํ ํฐ ๋ฐ๊ธ: ์ธ๊ฐ ์๋ฒ โ ํด๋ผ์ด์ธํธ (์ก์ธ์ค ํ ํฐ ์ ๋ฌ)
- ๋ฆฌ์์ค ์ ๊ทผ: ํด๋ผ์ด์ธํธ โ ๋ฆฌ์์ค ์๋ฒ (ํ ํฐ์ ์ด์ฉํด ์์ฒญ)
๐ ๋ณด์ ๊ณ ๋ ค์ฌํญ
- ๋ฏผ๊ฐํ ์ ๋ณด ํฌํจ ๊ธ์ง: JWT์๋ ๋น๋ฐ๋ฒํธ๋ ๊ฐ์ธ ์ ๋ณด ๋ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง ์์์ผ ํฉ๋๋ค.
- ํ ํฐ ์๋ช
๊ด๋ฆฌ: ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์ ์ ํ ์ค์ ํ์ฌ ๋ณด์์ ๊ฐํํฉ๋๋ค.
- HTTPS ์ฌ์ฉ: ํต์ ๊ณผ์ ์์ ํ ํฐ์ด ๋
ธ์ถ๋์ง ์๋๋ก HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
- ํ ํฐ ์ ์ฅ ์์น: ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ณด๋ค๋ ์ฟ ํค(HTTP Only)์ ์ ์ฅํ์ฌ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๐ ํ๋์ ์ดํดํ๋ JWT์ ์๋ ์๋ฆฌ์ ์ธ์ฆ ๊ณผ์ ! ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ธ์ฆ ๊ณผ์ ์์ JWT๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. JWT๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฌด์ํ ์ธ์ฆ์ ๊ตฌํํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋๋ฐ์, ๊ทธ ์๋ฆฌ์ ์ค์ ์ ์ฉ ๋ฐฉ๋ฒ์ ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ง JWT๋ ๋ฌด์์ด๋ฉฐ ์ด๋ป๊ฒ ์๋ํ๋์?
JSON Web Token(JWT)์ JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์กํ๊ธฐ ์ํ ๊ฐ๋ฐฉํ ํ์ค(RFC 7519)์
๋๋ค. ์ธ์ฆ ๊ณผ์ ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด, ์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ ์ ์๋ JWT๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ์ด ํ ํฐ์ ์ดํ ์์ฒญ์์ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช
์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์๋ฒ๋ ์ด ํ ํฐ์ ๊ฒ์ฆํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐ JWT ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ๋ณด์ ๋ฌธ์ ๋ฐฉ์ง: JWT๋ ์๊ฒฉ ์ฆ๋ช
์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์, ํ ํฐ์ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ํ ํฐ์ ์๋ช
๊ด๋ฆฌ: ํ์ํ ๊ธฐ๊ฐ ์ด์์ผ๋ก ํ ํฐ์ ๋ณด๊ดํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์ ์ฅ ๊ธ์ง: ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ์์ ๋ฏผ๊ฐํ ์ธ์
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๐ก JWT๋ฅผ ์ฌ์ฉํ ์ธ์ฆ ๊ณผ์ ์์ธํ ๋ณด๊ธฐ
1๏ธโฃ ์ฌ์ฉ์๊ฐ ๋ณดํธ๋ ๊ฒฝ๋ก๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ณ ์ ํ ๋
- ๋ณดํธ๋ ๊ฒฝ๋ก ๋๋ ๋ฆฌ์์ค๋ ๋ก๊ทธ์ธํ ์ฌ์ฉ์๋ง ์ ๊ทผํ ์ ์๋ ํ์ด์ง๋ API ์๋ํฌ์ธํธ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ง์ดํ์ด์ง, ๊ด๋ฆฌ์ ํ์ด์ง, ํน์ ๊ธฐ๋ฅ ๋ฑ์ด ์ด์ ํด๋นํฉ๋๋ค.
2๏ธโฃ ์ฌ์ฉ์ ์์ด์ ํธ๋ Authorization ํค๋์ JWT๋ฅผ ํฌํจํ์ฌ ์ ์ก
3๏ธโฃ ์๋ฒ๊ฐ Authorization ํค๋์ ์๋ ์ ํจํ JWT๋ฅผ ํ์ธ
- ์๋ฒ๋ ์์ฒญ์
Authorization ํค๋์์ JWT๋ฅผ ์ถ์ถํฉ๋๋ค.
- JWT ๊ฒ์ฆ ์ ์ฐจ:
- ์๋ช
๊ฒ์ฆ: ํ ํฐ์ด ์์กฐ๋๊ฑฐ๋ ๋ณ์กฐ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
- ๋ง๋ฃ ์๊ฐ ํ์ธ: ํ ํฐ์ด ๋ง๋ฃ๋์ง ์์๋์ง ํ์ธํฉ๋๋ค.
- ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธ์ฆ ์ค๋ฅ๋ฅผ ๋ฐํํฉ๋๋ค.
4๏ธโฃ ๋ฌด์ํ(stateless) ์ธ์ฆ ๋ฉ์ปค๋์ฆ
- JWT๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๋ ์ธ์
์ ๋ณด๋ฅผ ์ ์งํ์ง ์๊ณ ๋ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ ์ ์์ต๋๋ค.
- ๋ฌด์ํ๋ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ์ง ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๊ฐ ์์ฒญ์ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ๋งค๋ฒ JWT๋ฅผ ํตํด ์ธ์ฆํฉ๋๋ค.
5๏ธโฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ค์ผ ์ ์์
- JWT์๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ด, ์๋ฒ๊ฐ ๋งค๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ์ง ์์๋ ๋ฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, JWT์ ์ฌ์ฉ์์ ์ญํ (role) ์ ๋ณด๊ฐ ์๋ค๋ฉด, ์๋ฒ๋ ์ด๋ฅผ ํ ๋๋ก ๊ถํ์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
- ํ์ง๋ง ๋ฏผ๊ฐํ ์ ๋ณด๋ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๋ฐ์ดํฐ๋ ์ฌ์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
๐ CORS ๋ฌธ์ ์์ด JWT ์ฌ์ฉํ๊ธฐ
1๏ธโฃ CORS๋ ๋ฌด์์ธ๊ฐ์?
- CORS(Cross-Origin Resource Sharing)๋ ์๋ก ๋ค๋ฅธ ์ถ์ฒ(origin) ๊ฐ์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ๊ด๋ฆฌํ๋ ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ
์
๋๋ค.
- ์ถ์ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ ํฌํธ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ๋ฐ์ํ๋ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
2๏ธโฃ ์ฟ ํค์ CORS ๋ฌธ์
- ์ฟ ํค๋ฅผ ํฌํจํ ์์ฒญ์ CORS ์ ์ฑ
์ ์ ์ฝ์ ๋ฐ์ต๋๋ค.
- ๋ค๋ฅธ ์ถ์ฒ๋ก ์ฟ ํค๋ฅผ ์ ์กํ๋ ค๋ฉด ์๋ฒ์์ CORS ์ค์ ์ ๋ช
์์ ์ผ๋ก ํ์ฉํด์ผ ํฉ๋๋ค.
3๏ธโฃ Authorization ํค๋์ ํ ํฐ์ ๋ด์ ์ ์กํ๋ ๊ฒฝ์ฐ
- JWT๋ฅผ Authorization ํค๋์ ๋ด์ ์ ์กํ๋ฉด ์ฟ ํค๊ฐ ์๋๋ฏ๋ก CORS ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ Authorization ํค๋์ ๋ด๊ธด JWT๋ฅผ ์ผ๋ฐ ํค๋๋ก ์ทจ๊ธํ์ฌ ๋ณ๋์ CORS ์ค์ ์์ด๋ ์์ฒญ์ ๋ณด๋
๋๋ค.
โ
์์ฝ
- JWT๋ฅผ Authorization ํค๋์ ๋ด์ ์ ์กํ๋ฉด CORS ๋ฌธ์ ์์ด ๋ค์ํ ์ถ์ฒ์์ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
๐ JWT ์์ฑ๋ถํฐ ๋ฆฌ์์ค ์ ๊ทผ๊น์ง์ ๊ณผ์
1๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์
๋๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธ๊ฐ ์๋ฒ์ ์ ๊ทผ ๊ถํ์ ์์ฒญ
- ์ ํ๋ฆฌ์ผ์ด์
๋๋ ํด๋ผ์ด์ธํธ: ์น ์ฑ, ๋ชจ๋ฐ์ผ ์ฑ, API ํด๋ผ์ด์ธํธ ๋ฑ
- ์ธ๊ฐ ์๋ฒ(Authorization Server): ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ํ ํฐ ๋ฐ๊ธ์ ๋ด๋น
- ์ธ๊ฐ ํ๋ฆ(Authorization Flow):
2๏ธโฃ ์ธ๊ฐ๊ฐ ์น์ธ๋๋ฉด, ์ธ๊ฐ ์๋ฒ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ก์ธ์ค ํ ํฐ์ ๋ฐํ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์ธ๊ฐ ์๋ฒ๋ ์ก์ธ์ค ํ ํฐ(Access Token)์ ๋ฐ๊ธํฉ๋๋ค.
- ์ด ํ ํฐ์ ์ผ๋ฐ์ ์ผ๋ก JWT ํ์์ด๋ฉฐ, ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
3๏ธโฃ ์ ํ๋ฆฌ์ผ์ด์
์ ์ด ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํด ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผ
โ
์์ฝ
- ์ธ๊ฐ ์์ฒญ: ํด๋ผ์ด์ธํธ โ ์ธ๊ฐ ์๋ฒ (๋ก๊ทธ์ธ ์์ฒญ)
- ํ ํฐ ๋ฐ๊ธ: ์ธ๊ฐ ์๋ฒ โ ํด๋ผ์ด์ธํธ (์ก์ธ์ค ํ ํฐ ์ ๋ฌ)
- ๋ฆฌ์์ค ์ ๊ทผ: ํด๋ผ์ด์ธํธ โ ๋ฆฌ์์ค ์๋ฒ (ํ ํฐ์ ์ด์ฉํด ์์ฒญ)
๐ ๋ณด์ ๊ณ ๋ ค์ฌํญ
- ๋ฏผ๊ฐํ ์ ๋ณด ํฌํจ ๊ธ์ง: JWT์๋ ๋น๋ฐ๋ฒํธ๋ ๊ฐ์ธ ์ ๋ณด ๋ฑ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ง ์์์ผ ํฉ๋๋ค.
- ํ ํฐ ์๋ช
๊ด๋ฆฌ: ํ ํฐ์ ๋ง๋ฃ ์๊ฐ์ ์ ์ ํ ์ค์ ํ์ฌ ๋ณด์์ ๊ฐํํฉ๋๋ค.
- HTTPS ์ฌ์ฉ: ํต์ ๊ณผ์ ์์ ํ ํฐ์ด ๋
ธ์ถ๋์ง ์๋๋ก HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํฉ๋๋ค.
- ํ ํฐ ์ ์ฅ ์์น: ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ณด๋ค๋ ์ฟ ํค(HTTP Only)์ ์ ์ฅํ์ฌ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๐ฅ JWT๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ์ ๋์นญํค vs ๋น๋์นญํค ์๋ฒฝ ์ ๋ฆฌ! ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ JSON Web Token(JWT)์ ์ฅ์ ๊ณผ ํจ๊ป ๋์นญํค์ ๋น๋์นญํค์ ์ฐจ์ด์ ์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค. JWT๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ ๋ถํฐ ์ํธํ ๋ฐฉ์์ ํต์ฌ๊น์ง ํ๋์ ํ์
ํ ์ ์๋๋ก ์ค๋นํ์ผ๋, ๋๊น์ง ํจ๊ป ํด์ฃผ์ธ์! ๐
๐ก๏ธ ์ JSON Web Token(JWT)์ ์ฌ์ฉํด์ผ ํ ๊น์?
JWT๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธ์ฆ๊ณผ ์ ๋ณด ๊ตํ์ ์ํด ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ ํฐ์
๋๋ค. ๊ทธ ์ด์ ๋ฅผ ๋ค๋ฅธ ํ ํฐ์ธ Simple Web Token(SWT)๊ณผ Security Assertion Markup Language Token(SAML)๊ณผ ๋น๊ตํ์ฌ ์์๋ณด๊ฒ ์ต๋๋ค.
1๏ธโฃ ํฌ๊ธฐ ์ธก๋ฉด: ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ JWT ๐
- JSON์ XML๋ณด๋ค ๊ฐ๊ฒฐํฉ๋๋ค. ๋ฐ๋ผ์ JWT๋ XML ๊ธฐ๋ฐ์ SAML๋ณด๋ค ํฌ๊ธฐ๊ฐ ์๊ณ ์ปดํฉํธํฉ๋๋ค.
- ์์ ํฌ๊ธฐ๋ ๋คํธ์ํฌ ๋์ญํญ์ ์ ์ฝํ๊ณ , ์ ์ก ์๋๋ฅผ ๋์ฌ์ค๋๋ค.
- HTML๊ณผ HTTP ํ๊ฒฝ์์ ์ ์ก์ ์ต์ ํ๋์ด ์์ด ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์ ๋ฆฌํฉ๋๋ค.
2๏ธโฃ ๋ณด์ ์ธก๋ฉด: ๋์นญํค์ ๋น๋์นญํค ๋ชจ๋ ์ง์ ๐
- SWT๋ ๊ณต์ ๋น๋ฐํค(๋์นญํค)๋ง์ ์ฌ์ฉํ์ฌ ์๋ช
ํ ์ ์์ต๋๋ค.
- JWT์ SAML์ ๊ณต๊ฐ/๊ฐ์ธ ํค ์(๋น๋์นญํค)์ ์ฌ์ฉํ์ฌ ์๋ช
ํ ์ ์์ด ๋ณด์์ฑ์ด ๋์ต๋๋ค.
- JSON์ ๊ฐ๋จํ๊ฒ ์๋ช
ํ ์ ์์ด ๋ณด์ ๊ตฌํ์ด ์ฉ์ดํฉ๋๋ค.
3๏ธโฃ ์ธ์ด ํธํ์ฑ ์ธก๋ฉด: ๋ค๋ฃจ๊ธฐ ์ฌ์ด JWT ๐
- JSON ํ์๋ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค.
- JSON์ ๊ฐ์ฒด๋ก ์ง์ ๋งคํ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์ฑ์ด ์ฉ์ดํฉ๋๋ค.
- ๋ฐ๋ฉด, XML์ ๋ณต์กํ ํ์ฑ ๊ณผ์ ์ด ํ์ํ๊ณ , ๋ฌธ์-๊ฐ์ฒด ๋งคํ์ด ์์ฐ์ค๋ฝ์ง ์์ต๋๋ค.
4๏ธโฃ ์ฌ์ฉ ์ฉ์ด์ฑ ์ธก๋ฉด: ํด๋ผ์ด์ธํธ ์ธก์์์ ํธ์์ฑ ๐ค
- JWT๋ ์ธํฐ๋ท ๊ท๋ชจ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ฌ๋ฌ ํ๋ซํผ์์ ํด๋ผ์ด์ธํธ ์ธก ์ฒ๋ฆฌ๊ฐ ์ฝ์ต๋๋ค.
- ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ํจ์จ์ ์ผ๋ก ๋์ํ์ฌ, ๋ค์ํ ๋๋ฐ์ด์ค์์ ํ์ฉํ๊ธฐ ์ข์ต๋๋ค.
โ
๊ฒฐ๋ก : ํฌ๊ธฐ, ๋ณด์, ํธํ์ฑ, ์ฌ์ฉ ์ฉ์ด์ฑ ๋ฉด์์ JWT๋ ์ต์ ์ ์ ํ์
๋๋ค!
๐ ๋์นญํค์ ๋น๋์นญํค, ๋ฌด์์ด ๋ค๋ฅผ๊น์?
์ํธํ ๋ฐฉ์์์ ์ฌ์ฉํ๋ ๋์นญํค์ ๋น๋์นญํค๋ ๊ฐ๊ฐ์ ํน์ง๊ณผ ์ฌ์ฉ ์ฉ๋๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ์ดํดํ๋ฉด JWT๋ฅผ ๋น๋กฏํ ๋ค์ํ ๋ณด์ ๊ธฐ์ ์ ๋ ์ ํ์ฉํ ์ ์์ต๋๋ค.
1๏ธโฃ ๋์นญํค (Symmetric Key) ์ํธํ
๐ ํน์ง
- ํ๋์ ๋์ผํ ํค๋ก ๋ฐ์ดํฐ๋ฅผ ์ํธํ์ ๋ณตํธํํฉ๋๋ค.
- ์ํธํ์ ๋ณตํธํ์ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, ํค์ ์์ ํ ๊ณต์ ๊ฐ ์ค์ํฉ๋๋ค.
๐ ์ฌ์ฉ ๋ฐฉ์
- ํค ๊ณต์ : ํต์ ๋น์ฌ์
A์ B๊ฐ ๋์ผํ ๋น๋ฐํค๋ฅผ ๋ฏธ๋ฆฌ ๊ณต์ ํฉ๋๋ค.
- ์ํธํ:
A๋ ์ด ๋น๋ฐํค๋ก ๋ฉ์์ง๋ฅผ ์ํธํํ์ฌ B์๊ฒ ๋ณด๋
๋๋ค.
- ๋ณตํธํ:
B๋ ๋ฐ์ ๋ฉ์์ง๋ฅผ ๊ฐ์ ๋น๋ฐํค๋ก ๋ณตํธํํ์ฌ ๋ด์ฉ์ ํ์ธํฉ๋๋ค.
๐ ์ฅ์
- ์๋๊ฐ ๋น ๋ฆ: ์ํธํ/๋ณตํธํ ์ฐ์ฐ์ด ๋จ์ํ์ฌ ๋๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ๋ฆฌํฉ๋๋ค.
โ ๏ธ ๋จ์
- ํค ๊ด๋ฆฌ์ ์ด๋ ค์: ํค๋ฅผ ์์ ํ๊ฒ ๊ณต์ ํ๊ณ ๋ณด๊ดํด์ผ ํ๋ฉฐ, ํค ์ ์ถ ์ ๋ณด์ ์ํ์ด ์์ต๋๋ค.
๐ก ์์
- ํ์ผ ์ํธํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธํ ๋ฑ์์ ์ฌ์ฉ๋ฉ๋๋ค.
2๏ธโฃ ๋น๋์นญํค (Asymmetric Key) ์ํธํ
๐ ํน์ง
- ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํค(๊ณต๊ฐํค์ ๊ฐ์ธํค)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ณต๊ฐํค(Public Key): ๋๊ตฌ๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ, ๋ฐ์ดํฐ ์ํธํ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ฐ์ธํค(Private Key): ์์ ์๋ง ์๊ณ ์์ผ๋ฉฐ, ์ํธํ๋ ๋ฐ์ดํฐ์ ๋ณตํธํ์ ์ฌ์ฉ๋ฉ๋๋ค.
๐ ์ฌ์ฉ ๋ฐฉ์
- ๊ณต๊ฐํค ๋ฐฐํฌ: ์์ ์
B๋ ์์ ์ ๊ณต๊ฐํค๋ฅผ ๊ณต๊ฐํฉ๋๋ค.
- ์ํธํ: ๋ฐ์ ์
A๋ B์ ๊ณต๊ฐํค๋ก ๋ฉ์์ง๋ฅผ ์ํธํํ์ฌ ๋ณด๋
๋๋ค.
- ๋ณตํธํ:
B๋ ์์ ์ ๊ฐ์ธํค๋ก ๋ฉ์์ง๋ฅผ ๋ณตํธํํฉ๋๋ค.
๐ ์ฅ์
- ํค ๊ณต์ ์ ์์ ์ฑ: ๊ฐ์ธํค๋ฅผ ๊ณต์ ํ ํ์๊ฐ ์์ด ๋ณด์์ฑ์ด ๋์ต๋๋ค.
- ๋ค์์์ ์์ ํ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
โ ๏ธ ๋จ์
- ์๋๊ฐ ๋๋ฆผ: ๋์นญํค ์ํธํ์ ๋นํด ์ฐ์ฐ ์๋๊ฐ ๋๋ฆฝ๋๋ค.
- ๊ณ์ฐ ๋น์ฉ ์ฆ๊ฐ: ๋ณต์กํ ์ํ์ ์ฐ์ฐ์ด ํ์ํฉ๋๋ค.
๐ก ์์
- HTTPS ํต์ , ์ ์ ์๋ช
, SSL/TLS ์ธ์ฆ์ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
๐ ๋์นญํค vs ๋น๋์นญํค ๋น๊ต ์ ๋ฆฌ
| ๋์นญํค ์ํธํ | ๋น๋์นญํค ์ํธํ |
|---|
| ์ฌ์ฉํ๋ ํค | ๋์ผํ ํค(๋น๋ฐํค) ์ฌ์ฉ | ๊ณต๊ฐํค์ ๊ฐ์ธํค ํ ์ ์ฌ์ฉ |
| ์ฅ์ | ์๋๊ฐ ๋น ๋ฆ | ํค ์ ์ถ ์ํ์ด ์ ์ |
| ๋จ์ | ํค ๊ด๋ฆฌ์ ์ด๋ ค์ (์ ์ถ ์ํ) | ์๋๊ฐ ๋๋ฆผ, ๊ณ์ฐ ๋น์ฉ ๋์ |
| ์ฌ์ฉ ์์ | ํ์ผ ์ํธํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํธํ | HTTPS, ์ ์ ์๋ช
, ์ธ์ฆ์ |
๐ง ๋น๋์นญํค ์ํธํ, ๋ ์์ธํ ์์๋ณด๊ธฐ
๋น๋์นญํค ์ํธํ๋ ์ด๋ป๊ฒ ๋ณด์์ฑ์ ๋์ผ ์ ์๋์ง ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ ์๋ ์๋ฆฌ
- ์ํ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ณต๊ฐํค์ ๊ฐ์ธํค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ํ ํค๋ก ์ํธํ๋ ๋ฐ์ดํฐ๋ ๋ฐ๋์ชฝ ํค๋ก๋ง ๋ณตํธํํ ์ ์์ต๋๋ค.
๐ ์์๋ก ์ดํดํ๊ธฐ
- ๊ณต๊ฐํค ๋ฐฐํฌ:
B๋ ์์ ์ ๊ณต๊ฐํค๋ฅผ ๊ณต๊ฐํฉ๋๋ค.
- ๋ฉ์์ง ์ํธํ:
A๋ B์ ๊ณต๊ฐํค๋ก ๋ฉ์์ง๋ฅผ ์ํธํํฉ๋๋ค.
- ๋ฉ์์ง ์ ์ก: ์ํธํ๋ ๋ฉ์์ง๋ฅผ
B์๊ฒ ์ ์กํฉ๋๋ค.
- ๋ฉ์์ง ๋ณตํธํ:
B๋ ์์ ์ ๊ฐ์ธํค๋ก ๋ฉ์์ง๋ฅผ ๋ณตํธํํฉ๋๋ค.
๐ ๋ณด์์ฑ
- ๊ฐ์ธํค๋ ์์ ์๋ง ์๊ณ ์์ผ๋ฏ๋ก, ์ค๊ฐ์ ๋๊ฐ ๋ฉ์์ง๋ฅผ ๊ฐ๋ก์ฑ๋ ๋ณตํธํํ ์ ์์ต๋๋ค.
- ํค ์ ์ถ ์ํ์ด ๋ฎ์, ๋ค์์ ์ฌ์ฉ์์ ์์ ํ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐ช ์ฟ ํค๋ฅผ ํ์ฉํ ์น ์ธ์ฆ์ ๋ชจ๋ ๊ฒ! ๋ณด์๊ณผ ํธ์์ฑ ์ฌ์ด์์ ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฟ ํค(Cookie)๋ฅผ ํ์ฉํ ์ธ์ฆ ๊ณผ์ ๊ณผ ๊ทธ ์ฅ๋จ์ ์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. ์ฟ ํค๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ์ง๋ง, ๋ณด์ ์ด์๋ ํจ๊ป ์กด์ฌํฉ๋๋ค. ๊ทธ๋ผ ์ฟ ํค์ ์ธ๊ณ๋ก ํจ๊ป ๋ ๋๋ณผ๊น์? ๐
๐ ์ฟ ํค(Cookie)๋ ๋ฌด์์ธ๊ฐ์?
์ฟ ํค๋ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ ์์ ํ
์คํธ ํ์ผ๋ก, ์น์ฌ์ดํธ๊ฐ ์ฌ์ฉ์์ ์ปดํจํฐ๋ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์ ์ฅํ๋ ๋ฐ์ดํฐ์
๋๋ค. ์ฃผ๋ก Key-Value ํํ์ ๋ฌธ์์ด๋ก ์ ์ฅ๋๋ฉฐ, ์ฌ์ฉ์์ ์ธ์
์ ๋ณด๋ ๊ฐ์ธ ์ค์ ๋ฑ์ ๊ธฐ์ตํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๐ ์ฟ ํค์ ๊ธฐ๋ณธ ํ์
sessionID=abc123; username=JohnDoe
- Key:
sessionID, username
- Value:
abc123, JohnDoe
๐ ์ฟ ํค๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ ๊ณผ์
์ฟ ํค๋ฅผ ํ์ฉํ ์ธ์ฆ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
1๏ธโฃ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ฟ ํค๋ฅผ ์ ์ก
์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ์์ ๋ก๊ทธ์ธ์ ์๋ํ๋ฉด, ์๋ฒ๋ ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ธ์
ID๋ ํ ํฐ์ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ ๋ณด๋ฅผ ์๋ต ํค๋์ Set-Cookie๋ผ๋ ํํ๋ก ํฌํจ์์ผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์กํฉ๋๋ค.
HTTP/1.1 200 OK
Set-Cookie: sessionID=abc123; Path=/; HttpOnly
Set-Cookie: ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ์ฟ ํค๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉํ๋ ํค๋์
๋๋ค.
HttpOnly: ์ด ์ต์
์ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค์ ์ ๊ทผํ ์ ์์ด XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
2๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ์ฟ ํค๋ฅผ ์ ์ฅํ๊ณ ์์ฒญ ์๋ง๋ค ์ ์ก
ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์์ ๋ฐ์ ์ฟ ํค๋ฅผ ์ ์ฅํฉ๋๋ค. ์ดํ ํด๋น ๋๋ฉ์ธ์ผ๋ก ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ์๋์ผ๋ก ์ฟ ํค๋ฅผ Cookie ํค๋์ ํฌํจํ์ฌ ์๋ฒ๋ก ์ ์กํฉ๋๋ค.
GET /dashboard HTTP/1.1
Host: www.example.com
Cookie: sessionID=abc123
3๏ธโฃ ์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ์ด์ฉํด ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณ
์๋ฒ๋ ์์ฒญ ํค๋์์ Cookie๋ฅผ ์ฝ์ด ์ฌ์ฉ์๋ฅผ ์๋ณํฉ๋๋ค. ์ธ์
ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์ฌ์ฉ์์ ์ธ์
์ ๋ณด๋ฅผ ์กฐํํ๊ณ , ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์์์ ํ์ธํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
โ ์ฟ ํค ์ฌ์ฉ์ ๋จ์ ๊ณผ ๋ณด์ ์ด์
์ฟ ํค๋ ํธ๋ฆฌํ์ง๋ง, ๋ช ๊ฐ์ง ๋จ์ ๊ณผ ๋ณด์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
1๏ธโฃ ๋ณด์ ๋ฌธ์
- ์ฟ ํค ๋
ธ์ถ ์ํ: ์ฟ ํค๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ฏ๋ก, ์
์์ ์ธ ์ฌ์ฉ์๊ฐ ์ฟ ํค๋ฅผ ํ์ทจํ๊ฑฐ๋ ์กฐ์ํ ์ ์์ต๋๋ค.
- ๋ฏผ๊ฐํ ์ ๋ณด ์ ์ฅ ๊ธ์ง: ID, ๋น๋ฐ๋ฒํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ฟ ํค์ ์ ์ฅํ๋ฉด ์ ๋ฉ๋๋ค.
2๏ธโฃ ๋ฐ์ดํฐ ์กฐ์ ๊ฐ๋ฅ์ฑ๊ณผ ํฌ๊ธฐ ์ ํ
- ์กฐ์ ๊ฐ๋ฅ์ฑ: ์ฌ์ฉ์๊ฐ ์ฟ ํค๋ฅผ ์์ ํ์ฌ ์๋ฒ์ ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
- ํฌ๊ธฐ ์ ํ: ์ฟ ํค๋ 4KB์ ํฌ๊ธฐ ์ ํ์ด ์์ด ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
3๏ธโฃ ๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ ๋ฌธ์
- ์ฟ ํค ์์ฑ ์ง์ ์ฐจ์ด: ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฟ ํค ์์ฑ(SameSite, Secure ๋ฑ)์ ๋ํ ์ง์์ด ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ์๊ธฐ์น ์์ ๋์: ํน์ ๋ธ๋ผ์ฐ์ ์์ ์ฟ ํค๊ฐ ์์๋๋ก ๋์ํ์ง ์์ ์ ์์ต๋๋ค.
4๏ธโฃ ๋คํธ์ํฌ ๋ถํ ์ฆ๊ฐ
- ๋งค ์์ฒญ ์ ์ฟ ํค ์ ์ก: ์ฟ ํค๋ ์์ฒญ๋ง๋ค ํค๋์ ํฌํจ๋๋ฏ๋ก, ์ฟ ํค ํฌ๊ธฐ๊ฐ ํด์๋ก ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฆ๊ฐํฉ๋๋ค.
- ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ: ๋ถํ์ํ ์ฟ ํค ๋ฐ์ดํฐ๋ ํ์ด์ง ๋ก๋ฉ ์๋์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
๐ก๏ธ ์ฟ ํค ์ฌ์ฉ ์ ๋ณด์ ๊ฐํ ๋ฐฉ๋ฒ
์ฟ ํค์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ณด์ ์กฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค.
1๏ธโฃ HttpOnly์ Secure ์์ฑ ์ฌ์ฉ
HttpOnly: ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค์ ์ ๊ทผํ ์ ์๊ฒ ํ์ฌ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
Secure: ์ฟ ํค๊ฐ HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์ก๋๋๋ก ํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
Set-Cookie: sessionID=abc123; Path=/; HttpOnly; Secure
2๏ธโฃ SameSite ์์ฑ ์ค์
SameSite: ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ(CSRF) ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฟ ํค์ ์ ์ก ๋ฒ์๋ฅผ ์ ํํฉ๋๋ค.
Strict: ๋์ผ ์ฌ์ดํธ์์๋ง ์ฟ ํค ์ ์ก
Lax: ์ผ๋ถ ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ์ ์ฟ ํค ์ ์ก ํ์ฉ
None: ๋ชจ๋ ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ์ ์ฟ ํค ์ ์ก
Set-Cookie: sessionID=abc123; Path=/; HttpOnly; Secure; SameSite=Strict
3๏ธโฃ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์๋ฒ์์ ๊ด๋ฆฌ
- ์ธ์
ID๋ง ์ฟ ํค์ ์ ์ฅํ๊ณ , ์ค์ ์ฌ์ฉ์ ์ ๋ณด๋ ์๋ฒ์ ์ธ์
์ ์ฅ์์์ ๊ด๋ฆฌํฉ๋๋ค.
- ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ํ์ฉํ์ฌ JWT ๋ฑ์ ์ฌ์ฉํ๋ฉด ๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
๐ ์ฟ ํค๋ฅผ ๋์ฒดํ๋ ์ธ์ฆ ๋ฐฉ์: JWT
์ฟ ํค์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด JSON Web Token(JWT)์ ํ์ฉํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ด ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๐ JWT์ ์ฅ์
- ๋ฌด์ํ ์ธ์ฆ: ์๋ฒ๊ฐ ์ธ์
์ ์ ์งํ์ง ์์๋ ๋ฉ๋๋ค.
- ๋ณด์์ฑ ๊ฐํ: ํ ํฐ์ ์๋ช
์ด ํฌํจ๋์ด ์์ด ์๋ณ์กฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- CORS ๋ฌธ์ ๊ฐ์: ์ฟ ํค๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ํฌ๋ก์ค ๋๋ฉ์ธ ์ด์๊ฐ ์ค์ด๋ญ๋๋ค.
๐ JWT ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ํ ํฐ ์ ์ฅ ์์น: ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์ธ์
์คํ ๋ฆฌ์ง์ ์ ์ฅํ๋ ๊ฒ์ ๋ณด์์ ์ทจ์ฝํ ์ ์์ต๋๋ค.
- ํ ํฐ ํ์ทจ ๋ฐฉ์ง: XSS, CSRF ๊ณต๊ฒฉ์ ๋๋นํ ๋ณด์ ์กฐ์น๊ฐ ํ์ํฉ๋๋ค.
๐ก๏ธ ์ธ์
(Session)์ ํ์ฉํ ์น ์ธ์ฆ ์๋ฒฝ ์ดํด! ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์ธ์
(Session)์ ํ์ฉํ ์ธ์ฆ ๊ณผ์ ๊ณผ ๊ทธ ์ฅ๋จ์ ์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. ์ธ์
์ ์ฟ ํค์ ๋ณด์ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๊ณ ์๋ ๋ฐฉ์์ผ๋ก, ์์ ํ ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ์ํ ์ ์ง๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๊ทธ๋ผ ์ธ์
์ ์ธ๊ณ๋ก ํจ๊ป ๋ ๋๋ณผ๊น์? ๐
๐ ์ธ์
(Session)์ด๋ ๋ฌด์์ธ๊ฐ์?
์ธ์
(Session)์ ์๋ฒ ์ธก์์ ์ฌ์ฉ์ ์ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ฌ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ํด๋ผ์ด์ธํธ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ณ , ์๋ฒ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ๋ณด์์ฑ์ ๋์
๋๋ค.
๐ ์ธ์
์ ์ฃผ์ ํน์ง
- ์๋ฒ ์ธก ์ ์ฅ: ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์ฅํ์ฌ ํด๋ผ์ด์ธํธ์ ์กฐ์์ ๋ฐฉ์งํฉ๋๋ค.
- ์ธ์
ID ์ฌ์ฉ: ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์ธ์
ID๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ์ํธ์์ฉํฉ๋๋ค.
- ์ํ ์ ์ง: ๋ก๊ทธ์ธ ์ํ์ ๊ฐ์ ์ฌ์ฉ์ ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
๐ ์ธ์
์ ์ด์ฉํ ๋ก๊ทธ์ธ ๊ณผ์
์ธ์
์ ํ์ฉํ ์ธ์ฆ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
1๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ๋ก๊ทธ์ธ ์์ฒญ (ID์ ๋น๋ฐ๋ฒํธ ์ ์ก)
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ํผ์ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๊ณ ์๋ฒ์ ์ ์กํฉ๋๋ค.
- HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ํธํ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
2๏ธโฃ ์๋ฒ์์ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ธ์
์์ฑ
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํ์ธํ์ฌ ์ธ์ฆํฉ๋๋ค.
- ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด ๊ณ ์ ํ ์ธ์
ID๋ฅผ ์์ฑํฉ๋๋ค.
- ์ธ์
์ ์ฅ์์ ์ธ์
ID์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
3๏ธโฃ ์ธ์
ID๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ (์ฟ ํค์ ์ ์ฅ)
-
์๋ฒ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์
ID๋ฅผ Set-Cookie ํค๋๋ฅผ ํตํด ์ ๋ฌํฉ๋๋ค.
HTTP/1.1 200 OK
Set-Cookie: sessionID=xyz456; Path=/; HttpOnly
-
ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ๋ ์ธ์
ID๋ฅผ ์ฟ ํค์ ์ ์ฅํฉ๋๋ค.
4๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ์ ์ธ์
ID ์ ์ก
5๏ธโฃ ์๋ฒ๊ฐ ์ธ์
ID๋ก ์ฌ์ฉ์ ์๋ณ ๋ฐ ์์ฒญ ์ฒ๋ฆฌ
- ์๋ฒ๋ ์์ฒญ์์ ์ธ์
ID๋ฅผ ์ถ์ถํ์ฌ ์ธ์
์ ์ฅ์์์ ์กฐํํฉ๋๋ค.
- ํด๋น ์ธ์
์ด ์ ํจํ๋ฉด ์ฌ์ฉ์๋ฅผ ์ธ์ฆ๋ ์ํ๋ก ํ๋จํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค.
๐บ๏ธ ์ธ์
์ธ์ฆ ๊ณผ์ ์ ํ๋ฆ๋
- ๋ก๊ทธ์ธ ์์ฒญ: ํด๋ผ์ด์ธํธ โ ์๋ฒ (ID์ ๋น๋ฐ๋ฒํธ ์ ์ก)
- ์ฌ์ฉ์ ์ธ์ฆ: ์๋ฒ (DB ์กฐํ)
- ์ธ์
์์ฑ: ์๋ฒ (์ธ์
์ ์ฅ์์ ์ธ์
์ ๋ณด ์ ์ฅ)
- ์ธ์
ID ๋ฐ๊ธ: ์๋ฒ โ ํด๋ผ์ด์ธํธ (
Set-Cookie๋ก ์ ๋ฌ)
- ์์ฒญ ์ ์ธ์
ID ์ ์ก: ํด๋ผ์ด์ธํธ โ ์๋ฒ (์ฟ ํค์ ํฌํจ)
- ์ธ์
ํ์ธ: ์๋ฒ (์ธ์
์ ์ฅ์์์ ์ธ์
ID ์กฐํ)
- ์์ฒญ ์ฒ๋ฆฌ: ์๋ฒ โ ํด๋ผ์ด์ธํธ (์ธ์ฆ๋ ์ฌ์ฉ์๋ก์ ์๋ต)
โ ์ธ์
์ฌ์ฉ์ ๋จ์ ๊ณผ ๊ณ ๋ ค์ฌํญ
์ธ์
์ ๋ณด์์ฑ์ด ๋์ง๋ง, ๋ช ๊ฐ์ง ๋จ์ ๊ณผ ์ด์๊ฐ ์์ต๋๋ค.
1๏ธโฃ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
- ์ธ์
์ ์ฅ ๋ถ๋ด: ๋ชจ๋ ์ฌ์ฉ์ ์ธ์
์ ๋ณด๋ฅผ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฏ๋ก, ์ฌ์ฉ์๊ฐ ๋ง์์ง์๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํฉ๋๋ค.
- ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ธํด ์๋ฒ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
2๏ธโฃ ํ์ฅ์ฑ ๋ฌธ์ (Scale-out ๋ฐ Scale-up ํ์)
- ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ด์: ์ฌ๋ฌ ๋์ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ธ์
์ ๋ณด๋ฅผ ๊ณต์ ํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ธ์
๋๊ธฐํ ํ์: ๊ฐ ์๋ฒ ๊ฐ์ ์ธ์
์ ๋ณด๋ฅผ ๋๊ธฐํํด์ผ ํ๋ฉฐ, ์ด๋ ๋ณต์ก์ฑ์ ์ฆ๊ฐ์ํต๋๋ค.
3๏ธโฃ ์ธ์
ID ํ์ทจ ์ํ
- ์ฟ ํค์ ์ ์ฅ๋ ์ธ์
ID๊ฐ ํ์ทจ๋ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๊ฐ ์ธ์
์ ๊ฐ๋ก์ฑ์ด ์ธ์
ํ์ด์ฌํน(Session Hijacking)์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋ณด์ ์กฐ์น ํ์:
HttpOnly, Secure ์ต์
์ ์ฌ์ฉํ์ฌ ์ฟ ํค์ ๋ณด์์ ๊ฐํํด์ผ ํฉ๋๋ค.
4๏ธโฃ ๋งค ์์ฒญ ์ ์ธ์
์ ์ฅ์ ์กฐํ๋ก ์ธํ ๋ถํ
- ์ฑ๋ฅ ๋ฌธ์ : ์์ฒญ๋ง๋ค ์ธ์
์ ์ฅ์์์ ์ธ์
์ ๋ณด๋ฅผ ์กฐํํ๋ฏ๋ก, ํธ๋ํฝ์ด ๋ง์ ๊ฒฝ์ฐ ๋ถํ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์บ์ฑ ์ ๋ต ํ์: ์ธ์
๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ์ ๋ต์ด ํ์ํฉ๋๋ค.
๐ก๏ธ ์ธ์
์ฌ์ฉ ์ ๋ณด์ ๋ฐ ์ฑ๋ฅ ๊ฐํ ๋ฐฉ๋ฒ
1๏ธโฃ ์ธ์
์ ์ฅ์ ์ต์ ํ
- ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ: Redis, Memcached ๋ฑ์ ์ฌ์ฉํ์ฌ ์ธ์
์กฐํ ์๋๋ฅผ ํฅ์์ํต๋๋ค.
- ์ธ์
๋ง๋ฃ ์๊ฐ ์ค์ : ๋ถํ์ํ ์ธ์
์ ์ ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์
๋๋ค.
2๏ธโฃ ์๋ฒ ํ์ฅ์ฑ ๊ฐ์
- ์ธ์
ํด๋ฌ์คํฐ๋ง: ์๋ฒ ๊ฐ ์ธ์
์ ๊ณต์ ํ ์ ์๋ ํด๋ฌ์คํฐ๋ง ๊ธฐ์ ์ ๋์
ํฉ๋๋ค.
- ๋ฌด์ํ ์ธ์ฆ์ผ๋ก ์ ํ: JWT ๋ฑ์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
3๏ธโฃ ์ฟ ํค ๋ณด์ ๊ฐํ
HttpOnly ์ต์
: ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค ์ ๊ทผ์ ๋ง์ XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
Secure ์ต์
: ์ฟ ํค๋ฅผ HTTPS ์ฐ๊ฒฐ์์๋ง ์ ์กํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
SameSite ์ต์
: ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ(CSRF) ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
๐ ์ธ์
์ ๋์ฒดํ๋ ์ธ์ฆ ๋ฐฉ์: ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
์ธ์
์ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด JSON Web Token(JWT)์ ํ์ฉํ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ด ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๐ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ์
- ๋ฌด์ํ(stateless) ์ธ์ฆ: ์๋ฒ๊ฐ ์ธ์
์ ์ ์ฅํ์ง ์์๋ ๋ฉ๋๋ค.
- ํ์ฅ์ฑ ์ฐ์: ์๋ฒ ๊ฐ ์ธ์
๊ณต์ ๊ฐ ํ์ ์์ผ๋ฏ๋ก, ๋ก๋ ๋ฐธ๋ฐ์ฑ์ด ์ฉ์ดํฉ๋๋ค.
- ๋ณด์์ฑ ๊ฐํ: ํ ํฐ์ ์๋ช
์ด ํฌํจ๋์ด ์์ด ์๋ณ์กฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๐ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ํ ํฐ ์ ์ฅ ์์น: ํ ํฐ ํ์ทจ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์์ ํ ์ ์ฅ์์ ๋ณด๊ดํด์ผ ํฉ๋๋ค.
- ํ ํฐ ๋ง๋ฃ ๊ด๋ฆฌ: ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ์ ์ ํ ์ค์ ํ์ฌ ๋ณด์์ ๊ฐํํฉ๋๋ค.
- HTTPS ์ฌ์ฉ: ํ ํฐ ์ ์ก ์ ํต์ ๋ณด์์ ์ ์งํด์ผ ํฉ๋๋ค.
๐ง ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋จ์ ์๋ฒฝ ์ ๋ฆฌ! ์์๋์ด์ผ ํ ๋ณด์ ์ด์๋ค ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ ํ ํฐ(Token) ๊ธฐ๋ฐ ์ธ์ฆ์ ๋จ์ ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ๋ณด์ ์ด์์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ธ์
์ ์ฌ์ฉํ์ง ์๊ณ ๋ ํ์ฅ์ฑ ์๋ ์ธ์ฆ ์์คํ
์ ๊ตฌ์ถํ ์ ์์ง๋ง, ๊ทธ๋งํผ ๊ณ ๋ คํด์ผ ํ ์ ๋ค๋ ๋ง์ต๋๋ค. ๊ทธ๋ผ ํจ๊ป ์ดํด๋ณด๋๋ก ํ์ฃ ! ๐
๐ง ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ด๋?
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ๊ฐ ์ฌ์ฉ์ ์ํ๋ฅผ ์ ์ฅํ์ง ์๊ณ ๋ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ์์
๋๋ค. ์ฃผ๋ก JSON Web Token(JWT)์ ์ฌ์ฉํ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ํ ํฐ์ ์์ฒญ ์๋ง๋ค ์ ์กํ์ฌ ์์ ์ ์ธ์ฆํฉ๋๋ค.
๐ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฅ์
- ๋ฌด์ํ(stateless) ์ธ์ฆ: ์๋ฒ์ ์ธ์
์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์๋ ๋ฉ๋๋ค.
- ํ์ฅ์ฑ ์ฐ์: ์๋ฒ ๊ฐ ์ํ ๊ณต์ ๊ฐ ํ์ ์์ด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ ๋ฆฌํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ค์ฌ: ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณด์ ํ๋ฏ๋ก ์๋ฒ ๋ถํ ๊ฐ์
โ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ๋จ์ ๊ณผ ๋ณด์ ์ด์
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ ๋ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ ๋จ์ ๋ค์ด ์์ต๋๋ค.
1๏ธโฃ ํ ํฐ์ ๋ฐ์ดํฐ ๊ธธ์ด ์ฆ๊ฐ ๐
- ๋ฐ์ดํฐ ๊ธธ์ด ์ฆ๊ฐ: JWT๋ ํค๋(header), ํ์ด๋ก๋(payload), ์๋ช
(signature)๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ฐ ๋ถ๋ถ์ด Base64Url๋ก ์ธ์ฝ๋ฉ๋์ด ํ ํฐ์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋๋ค.
- ๋คํธ์ํฌ ๋ถํ ์ฆ๊ฐ: ์์ฒญ ์๋ง๋ค ๊ธด ํ ํฐ์ ์ ์กํ๋ฏ๋ก, ๋คํธ์ํฌ ๋์ญํญ์ ๋ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
- ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ์ฑ: ํนํ ๋ชจ๋ฐ์ผ ๋คํธ์ํฌ๋ ๋์ญํญ์ด ์ ํ๋ ํ๊ฒฝ์์๋ ์๋ต ์๋๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค.
2๏ธโฃ ์ธ์ฆ ์์ฒญ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ๋คํธ์ํฌ ๋ถํ ์ฌํ ๐ก
- ์ฆ์ ์์ฒญ ์ ๋ถํ ์ฆ๊ฐ: ํด๋ผ์ด์ธํธ๊ฐ ๋น๋ฒํ๊ฒ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค๋ฉด, ํ ํฐ์ ํฌ๊ธฐ๋งํผ ๋คํธ์ํฌ ๋ถํ๊ฐ ๋์ ๋ฉ๋๋ค.
- ๋๊ท๋ชจ ์๋น์ค์์ ๋ฌธ์ ๋ฐ์: ๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ์ ์ํ๋ ๊ฒฝ์ฐ, ๋คํธ์ํฌ ํธ๋ํฝ์ด ๊ธ์ฆํ์ฌ ์๋ฒ ๋ฐ ๋คํธ์ํฌ ์์์ ๋ถ๋ด์ ์ค ์ ์์ต๋๋ค.
3๏ธโฃ ํ์ด๋ก๋(Payload)์ ์ํธํ ๋ฌธ์ ๐
- ํ์ด๋ก๋์ ๋
ธ์ถ ์ํ: JWT์ ํ์ด๋ก๋๋ Base64Url ์ธ์ฝ๋ฉ๋์ด ์์ ๋ฟ, ์ํธํ๋์ง ์์ต๋๋ค.
- ๋ฏผ๊ฐํ ์ ๋ณด ์ ์ถ ๊ฐ๋ฅ์ฑ: ํ ํฐ์ด ํ์ทจ๋๋ฉด ํ์ด๋ก๋์ ํฌํจ๋ ์ฌ์ฉ์ ์ ๋ณด๋ ๊ถํ ์ ๋ณด๊ฐ ๋
ธ์ถ๋ ์ ์์ต๋๋ค.
- ๋ณด์ ๊ฐํ ํ์:
- ๋ฏผ๊ฐํ ์ ๋ณด๋ ํ ํฐ์ ํฌํจํ์ง ์๊ธฐ
- ํ์ํ ๊ฒฝ์ฐ JWE(JSON Web Encryption)๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ ์์ฒด๋ฅผ ์ํธํ
4๏ธโฃ ํ ํฐ ํ์ทจ ์ํ๊ณผ ๋ง๋ฃ ์๊ฐ ์ค์ โฐ
- ํ ํฐ ํ์ทจ ์ํ: ํ ํฐ์ด ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์ก๋๋ ๊ณผ์ ์์ ์ค๊ฐ์ ๊ณต๊ฒฉ(MITM) ๋ฑ์ ์ํด ํ์ทจ๋ ์ ์์ต๋๋ค.
- ์ฌ์ฌ์ฉ ๊ณต๊ฒฉ ์ํ: ํ์ทจ๋ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ๊น์ง ๊ณ์ ์ฌ์ฉ๋ ์ ์์ด ๋ณด์ ์ํ์ด ํฝ๋๋ค.
- ๋ง๋ฃ ์๊ฐ ์ค์ ์ ์ค์์ฑ:
- ์งง์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ์ฌ ํ์ทจ๋ ํ ํฐ์ ์ ํจ ๊ธฐ๊ฐ์ ์ต์ํํฉ๋๋ค.
- Refresh Token์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ํ ํฐ์ ๋ง๋ฃ ์ ์ฌ์ธ์ฆ์ ์๊ตฌํฉ๋๋ค.
๐ก๏ธ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๋ณด์ ๊ฐํ ๋ฐฉ๋ฒ
1๏ธโฃ HTTPS๋ฅผ ํตํ ์์ ํ ํต์
- HTTPS ์ฌ์ฉ: ํ ํฐ ์ ์ก ์ TLS/SSL ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
2๏ธโฃ ํ ํฐ ์ ์ฅ ์์น ์์ ํ๊ฒ ๊ด๋ฆฌ
- ์ฟ ํค ์ฌ์ฉ ์:
HttpOnly ์ต์
์ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ถํฐ ์ ๊ทผ์ ๋ง์ต๋๋ค.
Secure ์ต์
์ ์ฌ์ฉํ์ฌ HTTPS์์๋ง ์ ์ก๋๋๋ก ํฉ๋๋ค.
- ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ฌ์ฉ ์ง์: XSS ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ฏ๋ก ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ํ ํฐ ์ ์ฅ์ ํผํฉ๋๋ค.
3๏ธโฃ ํ ํฐ์ ๋ง๋ฃ ์๊ฐ๊ณผ ๊ฐฑ์ ์ ๋ต ์๋ฆฝ
- ์ก์ธ์ค ํ ํฐ์ ๋ง๋ฃ ์๊ฐ ๋จ์ถ: ์งง์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ์ฌ ํ์ทจ๋ ํ ํฐ์ ์ํ์ ์ค์
๋๋ค.
- ๋ฆฌํ๋ ์ ํ ํฐ ์ฌ์ฉ: ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ๋ฆฌํ๋ ์ ํ ํฐ์ผ๋ก ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ต๋๋ค.
- ํ ํฐ ๋ธ๋๋ฆฌ์คํธ ๊ด๋ฆฌ: ๋ก๊ทธ์์์ด๋ ๋ณด์ ์ด๋ฒคํธ ๋ฐ์ ์ ํด๋น ํ ํฐ์ ๋ธ๋๋ฆฌ์คํธ์ ์ถ๊ฐํ์ฌ ๋ฌดํจํํฉ๋๋ค.
4๏ธโฃ ํ ํฐ์ ํ์ด๋ก๋ ์ต์ํ
- ํ์ํ ์ ๋ณด๋ง ํฌํจ: ํ ํฐ์ ์ต์ํ์ ์ ๋ณด๋ง ๋ด์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ณด์์ฑ์ ๋์
๋๋ค.
- ๋ฏผ๊ฐํ ์ ๋ณด ๋ฐฐ์ : ์ด๋ฉ์ผ, ๋น๋ฐ๋ฒํธ ๋ฑ ๊ฐ์ธ ์๋ณ ์ ๋ณด(PII)๋ ํ ํฐ์ ํฌํจํ์ง ์์ต๋๋ค.
๐ Refresh Token ์๋ฒฝ ์ดํดํ๊ธฐ! ๋ณด์๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ ๐
์๋
ํ์ธ์, ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ Refresh Token์ด ๋ฌด์์ธ์ง, ์ ํ์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ฒ ์ต๋๋ค. Access Token๊ณผ Refresh Token์ ํ์ฉํ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค๋ฅผ ๋จ๊ณ๋ณ๋ก ์ค๋ช
ํ์ฌ ์ฌ๋ฌ๋ถ์ ์ดํด๋ฅผ ๋๊ณ ์ ํฉ๋๋ค. ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ง Refresh Token์ด๋ ๋ฌด์์ธ๊ฐ์?
Refresh Token์ Access Token์ด ๋ง๋ฃ๋์์ ๋ ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ ํฐ์
๋๋ค. ์ฃผ๋ก OAuth 2.0 ์ธ์ฆ ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋๋ฉฐ, ๋ณด์์ฑ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ ํฅ์์ํค๋ ์ญํ ์ ํฉ๋๋ค.
๐ Refresh Token์ ์ฃผ์ ํน์ง
-
Access Token ํ์ทจ์ ๋ํ ์ต์ํ์ ๋๋น
- ๋ชฉ์ : Access Token์ด ํ์ทจ๋์์ ๋ ํผํด๋ฅผ ์ต์ํํฉ๋๋ค.
- ์ญํ : ํ์ทจ๋ Access Token์ด ๋ง๋ฃ๋๋ฉด ๋ ์ด์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ค์ ํ๊ณ , ์๋ก์ด Access Token์ Refresh Token์ ํตํด ๋ฐ๊ธ๋ฐ์ต๋๋ค.
-
Access Token์ ์ ํจ๊ธฐ๊ฐ์ ์งง๊ฒ ์ค์
- ๋ณด์ ๊ฐํ: ์งง์ ์ ํจ๊ธฐ๊ฐ์ผ๋ก ์ธํด ํ์ทจ๋ ํ ํฐ์ ์ฌ์ฉ ๊ธฐ๊ฐ์ ์ต์ํํฉ๋๋ค.
- ์ ํจ๊ธฐ๊ฐ ๊ด๋ฆฌ: Access Token์ ์ผ๋ฐ์ ์ผ๋ก ๋ช ๋ถ์์ ๋ช ์๊ฐ ์ ๋์ ์งง์ ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๋๋ค.
-
Refresh Token์ ํตํ Access Token ์ฌ๋ฐ๊ธ
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์: ์ฌ์ฉ์๊ฐ ๋ค์ ๋ก๊ทธ์ธํ ํ์ ์์ด ์๋ก์ด Access Token์ ๋ฐ์ ์ ์์ต๋๋ค.
- ์๋ํ ๊ฐ๋ฅ: ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ง๋ฃ๋ฅผ ๊ฐ์งํ๊ณ ์๋์ผ๋ก ํ ํฐ์ ๊ฐฑ์ ํ ์ ์์ต๋๋ค.
-
Refresh Token์ ๋ชฉ์ ๊ณผ ํน์ง
- ์ธ์ฆ ์ ๋ณด ๋ฏธํฌํจ: Refresh Token์ ๊ถํ์ด๋ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ง ์์ต๋๋ค.
- ๋ณด์์ฑ: ๋
ธ์ถ๋๋๋ผ๋ ์ง์ ์ ์ธ ๊ถํ ๋จ์ฉ์ด ์ด๋ ต์ง๋ง, ํ์ทจ๋๋ฉด ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ์ ์ ์์ผ๋ฏ๋ก ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
๐ Access Token๊ณผ Refresh Token์ ์ฌ์ฉํ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค
์ด์ Access Token๊ณผ Refresh Token์ ํ์ฉํ ๋ก๊ทธ์ธ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ ์์ฒญ ๋ฐ ํ ํฐ ๋ฐ๊ธ
- ์ฌ์ฉ์ ๋ก๊ทธ์ธ: ์ฌ์ฉ์๊ฐ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๊ณ ์๋ฒ์ ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋
๋๋ค.
- ์๋ฒ ์ธ์ฆ: ์๋ฒ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฒ์ฆํ๊ณ ์ธ์ฆ์ ์ฑ๊ณตํ๋ฉด Access Token๊ณผ Refresh Token์ ๋ฐ๊ธํฉ๋๋ค.
- ํ ํฐ ์ ๋ฌ: ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ ๊ฐ์ ํ ํฐ์ ๋ฐ์ต๋๋ค.
2๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ ์ ์ฅ ๋ฐ ์์ฒญ
-
ํ ํฐ ์ ์ฅ:
- Access Token: ๋ฉ๋ชจ๋ฆฌ๋ ์์ ํ ์ ์ฅ์์ ์ ์ฅํฉ๋๋ค.
- Refresh Token: ๋ณด์์ฑ์ด ๋์ ์ ์ฅ์(์: HttpOnly ์ฟ ํค)์ ์ ์ฅํฉ๋๋ค.
-
API ์์ฒญ ์: ํด๋ผ์ด์ธํธ๋ Access Token์ Authorization ํค๋์ ํฌํจํ์ฌ ์๋ฒ์ ์์ฒญ์ ๋ณด๋
๋๋ค.
GET /api/data HTTP/1.1
Host: api.example.com
Authorization: Bearer <Access Token>
3๏ธโฃ Access Token ๋ง๋ฃ ์ ์ค๋ฅ ๋ฐ์
-
Access Token ๋ง๋ฃ: ์ ํจ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ์๋ฒ๋ ํ ํฐ์ด ๋ง๋ฃ๋์๋ค๋ ์๋ต์ ๋ฐํํฉ๋๋ค.
-
์๋ต ์์:
{
"error": "invalid_token",
"error_description": "The access token expired"
}
4๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ Refresh Token์ ์ฌ์ฉํ์ฌ ์๋ก์ด Access Token ์์ฒญ
-
ํ ํฐ ๊ฐฑ์ ์์ฒญ: ํด๋ผ์ด์ธํธ๋ ์ ์ฅํด๋ Refresh Token์ ์ฌ์ฉํ์ฌ ์๋ก์ด Access Token ๋ฐ๊ธ์ ์์ฒญํฉ๋๋ค.
-
์์ฒญ ์์:
POST /oauth/token HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=<Refresh Token>
5๏ธโฃ ์๋ฒ๊ฐ Refresh Token ๊ฒ์ฆ ํ Access Token ์ฌ๋ฐ๊ธ
-
Refresh Token ๊ฒ์ฆ: ์๋ฒ๋ ํด๋น ํ ํฐ์ ์ ํจ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํฉ๋๋ค.
-
์๋ก์ด ํ ํฐ ๋ฐ๊ธ: ๊ฒ์ฆ์ ์ฑ๊ณตํ๋ฉด ์๋ก์ด Access Token(๋ฐ ํ์์ ์๋ก์ด Refresh Token)์ ๋ฐ๊ธํ์ฌ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํฉ๋๋ค.
-
์๋ต ์์:
{
"access_token": "<New Access Token>",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "<New Refresh Token>"
}
6๏ธโฃ ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด Access Token์ผ๋ก ์์ฒญ ์ฌ์๋
- ํ ํฐ ์ ์ฅ: ์๋ก์ด Access Token๊ณผ Refresh Token์ ์ ์ฅํฉ๋๋ค.
- ์์ฒญ ์ฌ์๋: ํด๋ผ์ด์ธํธ๋ ์ด์ ์ ์คํจํ๋ ์์ฒญ์ ์๋ก์ด Access Token์ผ๋ก ๋ค์ ์๋ํฉ๋๋ค.
๐ก๏ธ Refresh Token ์ฌ์ฉ ์ ๋ณด์ ๊ณ ๋ ค์ฌํญ
1๏ธโฃ Refresh Token์ ์์ ํ ์ ์ฅ
- ๋ณด์์ฑ ๋์ ์ ์ฅ์ ์ฌ์ฉ: ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ HttpOnly ์ฟ ํค์ ์ ์ฅํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ ๊ทผ์ ๋ง์ต๋๋ค.
- ํ์ทจ ๋ฐฉ์ง: Refresh Token์ด ํ์ทจ๋๋ฉด ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ์ ์ ์์ผ๋ฏ๋ก, ๋ฐ๋์ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
2๏ธโฃ Refresh Token์ ์ ํจ๊ธฐ๊ฐ ๊ด๋ฆฌ
- ์ ํจ๊ธฐ๊ฐ ์ค์ : Refresh Token์ ์ ํจ๊ธฐ๊ฐ์ ์ ์ ํ ์ค์ ํ์ฌ ๋ณด์์ ๊ฐํํฉ๋๋ค.
- ํ ํฐ ๊ฐฑ์ ์ ์ฑ
: ์ผ์ ๊ธฐ๊ฐ ํ์๋ ์ฌ์ฉ์๊ฐ ๋ค์ ๋ก๊ทธ์ธํ๋๋ก ์๊ตฌํ ์ ์์ต๋๋ค.
3๏ธโฃ ํ ํฐ ๋ฌดํจํ ์ ๋ต
- ๋ก๊ทธ์์ ์ ํ ํฐ ํ๊ธฐ: ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ๋ฉด ์๋ฒ์์ ํด๋น Refresh Token์ ํ๊ธฐํฉ๋๋ค.
- ํ ํฐ ๋ธ๋๋ฆฌ์คํธ: ์์ฌ์ค๋ฌ์ด ํ๋์ด ๊ฐ์ง๋๋ฉด ํด๋น ํ ํฐ์ ๋ธ๋๋ฆฌ์คํธ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ์ ์ฐจ๋จํฉ๋๋ค.
๐ Refresh Token๊ณผ Access Token ๋น๊ต
| Access Token | Refresh Token |
|---|
| ์ญํ | ๋ฆฌ์์ค ์๋ฒ์ ์์ฒญ ์ ์ธ์ฆ ์๋จ์ผ๋ก ์ฌ์ฉ | ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ |
| ์ ํจ๊ธฐ๊ฐ | ์งง์ (๋ช ๋ถ์์ ๋ช ์๊ฐ) | ๊น (๋ฉฐ์น ์์ ๋ช ๋ฌ) |
| ์ ์ฅ ์์น | ๋ฉ๋ชจ๋ฆฌ ๋๋ ์์ ํ ์ ์ฅ์ | ๋ณด์์ด ๊ฐํ๋ ์ ์ฅ์ (์: HttpOnly ์ฟ ํค) |
| ํฌํจ ์ ๋ณด | ์ฌ์ฉ์ ๊ถํ ๋ฐ ์ธ์ฆ ์ ๋ณด ํฌํจ | ์ธ์ฆ ์ ๋ณด ๋ฏธํฌํจ |
| ๋
ธ์ถ ์ ์ํ์ฑ | ์ฆ๊ฐ์ ์ธ ๊ถํ ๋จ์ฉ ๊ฐ๋ฅ | ์๋ก์ด Access Token ๋ฐ๊ธ ๊ฐ๋ฅ |