
ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๋ ์์ ๋ฐ์ดํฐ์ด๋ค. ์ฃผ๋ก ํ ์คํธ ํ์์ผ๋ก ์ ์ฅ๋๋ฉฐ, ๋ง๋ฃ ๊ธฐ๊ฐ์ ์ค์ ํ ์ ์๋ค. ํด๋ผ์ด์ธํธ, ์ฆ ์ฌ์ฉ์๊ฐ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ธ์ ๋ ์ง ์์ ํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค. ๋ฐ๋ผ์, ์์ ํ๋ฉด ์๋๋ ์ค์ํ ์ ๋ณด๋ฅผ ๋ด์๋๋ ๊ฒ์ ๋ถ์ ์ ํ๋ค. ์ค์ํ ์ ๋ณด๋ ์ธ์ ์ด ๋ ์ ํฉํ๋ค.
์ด ์ฟ ํค๋ฅผ ์ด์ฉํด์ ์๋ฒ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์ ์๋ค. ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๊ฐ ์ ์ฅ๋๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ฐฉ๋ฌธํ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฟ ํค๋ ํจ๊ป Request๋ก ๋ณด๋ผ ๊ฒ์ด๋ค.
์ฟ ํค๋ ์ธ์ฆ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์ด ์ค์ ์ ๋ฐ๊พธ๋ฉด ์๋ฒ๋ ์ฟ ํค๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์ธ์ด ์ค์ ์ ์ ์ฅํ๋ค. ๋ฐ๋ผ์, ๋ค์์ ํด๋น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ๋ฉด ์ฟ ํค๋ Request์ ํจ๊ป ์๋ฒ๋ก ๋ณด๋ด์ง๊ณ ์๋ฒ๋ ์ฟ ํค๊ฐ ๊ธฐ์ตํด๋ ์ธ์ด ์ค์ ์ ํ์ด์ง๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋๋ค.
์ค์ํ ์ ์, ์ฟ ํค๋ ๋๋ฉ์ธ์ ๋ฐ๋ผ ์ ํ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ ํ๋ธ๊ฐ ์ค ์ฟ ํค๋, ์ ํ๋ธ์๊ฒ๋ง ๋ณด๋ด์ง๋ค.
์ฐ๋ฆฌ๊ฐ ์น ์ฌ์ดํธ๋ฅผ ์ด์ฉํ ๋ ์ฐ๋ ํ๋กํ ์ฝ, HTTP๋ stateless์ด๋ค. ์๋ฒ๋ก ๊ฐ๋ ๋ชจ๋ ์์ฒญ์ ๋
๋ฆฝ์ ์ผ๋ก ๋ค๋ฃจ์ด์ง๋ค๋ ๋ป์ด๋ค. ์์ฒญ๋ผ๋ฆฌ ์ฐ๊ฒฐ์ด ์๊ณ , ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค! ์์ฒญ์ด ๋๋๋ฉด ์๋ฒ๋ ์ฐ๋ฆฌ๊ฐ ๋๊ตฌ์ธ์ง ๊ธฐ์ตํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์, ์์ฒญํ ๋๋ง๋ค ์ฐ๋ฆฌ๊ฐ ๋๊ตฌ์ธ์ง ์๋ ค์ค์ผ ํ๋ค. ์ด ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋ฐ๋ก ์ธ์
์ด๋ค.
์๋ฅผ ๋ค์ด, A๋ผ๋ ์ ์ ๊ฐ ๋ก๊ทธ์ธ์ ํ์ ๋ ์ ์ฅ๋ ํ์ ์ ๋ณด์ ์ผ์นํ๋ค๋ฉด ์๋ฒ๋ ์ธ์ DB์ ์ธ์ ID(sid)์ ํจ๊ป ์ ์ ๋ฅผ ์ ์ฅํ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์์ฑ๋ ์ฌ์ฉ์๋ณ๋ก ๊ณ ์ ํ ์ธ์ ID๋ ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๋ก ๋์์ค๊ณ , ์ ์ฅ๋๋ค! ์ฆ, ์ฟ ํค๋ ์ธ์ ID๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๋งค๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ๐ค
๋ฐ๋ผ์, ๊ฐ์ ์น์ฌ์ดํธ์ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๋ ์ธ์ ID๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ฟ ํค๋ฅผ ์๋ฒ์๊ฒ ๋ณด๋ผ ๊ฒ์ด๋ค. ์๋ฒ๋ ๋ค์ด์ค๋ ์ฟ ํค๋ฅผ ๋ณด๊ณ ์ธ์ ID๋ฅผ ์ ์ ์๊ณ , ํด๋น ์ธ์ ID๋ฅผ ๊ฐ์ง๊ณ ์ธ์ DB๋ฅผ ํ์ธํ ๊ฒ์ด๊ณ ๊ฑฐ๊ธฐ์ ํด๋น ์ธ์ ID๋ A์ ์ ๋ผ๋ ๊ฒ์ ์ ์ ์๋ค! ํด๋น ์์ฒญ์ด ๋๋๊ณ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๋ฉด, ์ด ๊ณผ์ ์ด ๋ฐ๋ณต๋๊ฒ ๋๋ค!
์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ฉด,
๋ธ๋ผ์ฐ์ ๋ ์ค์ง ์ธ์ ID๋ง ์๋ ์ฟ ํค๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๊ณ , ์ ์ ์ ์ค์ํ ์ ๋ณด๋ ๋ชจ๋ ์๋ฒ๊ฐ ๊ฐ์ง๊ณ ์๋ค. โก๏ธ ์ธ์ฆ์ ๋ํ ์ ๋ณด๋ฅผ ์๋ฒ๊ฐ ์ ์ฅํ๋ค.
ํ์ง๋ง, ์ธ์
์ ์ด์ฉํ์ฌ iOS, Android ์ฑ์ ๋ง๋ค ์ ์์ด๋ ์ฟ ํค๋ ์ฌ์ฉํ ์ ์๋ค. ์๋ํ๋ฉด ์ฟ ํค๐ช๋ ์ค์ง ๋ธ๋ผ์ฐ์ ์๋ง ์์ผ๋๊น!!
์ด๋ฐ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ํ ํฐ์ ์ฌ์ฉํ๋ค.(์ฟ ํค๋ ๋น์ทํ๋ค.) ํด๋น ํ ํฐ์ ์๋ฒ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ธ์
DB์์ ํด๋น ํ ํฐ๊ณผ ์ผ์นํ๋ ์ ์ ๋ฅผ ์ฐพ๋๋ค.
์ธ์ ์ ๋ํด์ ๊ธฐ์ตํด์ผ ํ ๊ฒ์, ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ๋ค์ ๋ชจ๋ ์ธ์ ID๋ฅผ DB(๋ฉ๋ชจ๋ฆฌ or ๋์คํฌ ๋ฑ์ โ์ ์ฅ์โ)์ ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค, ์๋ฒ๋ ์ฟ ํค ์ ์ธ์ ID์ ์ผ์นํ๋ ์ ์ ๋ฅผ ์ฐพ๊ธฐ ์ํด ์ธ์ DB๋ฅผ ๋ชจ๋ ์ฐพ์์ผ ํ๋ค! ์ ์ ๊ฐ ๋์ด๋ ์๋ก DB์๋ ์ ์ฅํด์ผ ํ๋ค. ๋ํ, ์ธ์ DB๋ฅผ ์ค์๋ก ๋ชจ๋ ๋ ๋ ค๋ฒ๋ฆฐ๋ค๋ฉด? ์ฌ์ฉ์๋ค์ ๋ชจ๋ ๋ก๊ทธ์ธ์ ๋ค์ ํด์ผํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ฒจ๋๋ค.
๋ฐ๋ก ์ด๋, JWT๊ฐ ๋ฑ์ฅํ๋ค. JWT๋ ํ ํฐ ํ์์ด๋ค. JWT๋ก ์ ์ ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ฉด, ์ธ์ DB๋ฅผ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๊ณ ์๋ฒ๊ฐ ์ ์ ์ธ์ฆ์ ํ ํ์๊ฐ ์๋ค. ๐ซขย (์ ๊น, JWT๊ฐ ๋ง๋ฅ์ ์๋๋ค!)
๋ก๊ทธ์ธ ์์๋ฅผ ํตํด ์ธ์
๊ณผ JWT์ ์ฐจ์ด๋ฅผ ์์๋ณด์.
๋ง์ฝ ์ ์ A๊ฐ ๋ก๊ทธ์ธ์ ํ๋ ค๋ฉด ์์ด๋, ๋น๋ฐ๋ฒํธ๋ฅผ ์๋ฒ์ ๋ณด๋ผ ๊ฒ์ด๋ค.(์ฌ๊ธฐ๊น์ง ์ธ์
๊ณผ ๋ค๋ฅธ ์ ์ด ์๋ค.)
ํ์์ ๋ณด๊ฐ ์ผ์นํ๋ค๋ฉด, ์๋ฒ๋ DB์ ์ ์ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๋๋ค. ๋์ , ์๋ฒ๋ ์๋ฅผ ๋ค์ด ์ ์ ์ id๋ฅผ ๊ฐ์ ธ๊ฐ์ ์ฌ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ์ฌ ์ฌ์ธ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ , ํด๋น ์ฌ์ธ๋ ์ ๋ณด๋ฅผ String ํํ๋ก ๋ณธ๋ด๋ค. JWT๋ ์ด๋ฐ์์ผ๋ก ์๊ฒผ๋ค. ๋งค์ฐ ๊ธธ๋ค. ์ฟ ํค๋ ๊ณต๊ฐ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๊ธด ํํ๋ ๋ถ๊ฐํ๋ค. ํ์ง๋ง JWT๋ ๊ณต๊ฐ ์ ์ฝ์ด ์์ด์ ์์ฒญ ๊ธธ์ด๋ ๋๋ค!
์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ฉด,
JWT๋ ํ ํฐ์ ํ ์ข ๋ฅ์ด๋ฉฐ, JSON ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
โก๏ธ ์ธ์ฆ์ ๋ํ ์ ๋ณด๋ฅผ ์ฌ์ฉ์๊ฐ ์ ์ฅํ๋ค.

์ถ์ฒ : https://jwt.io/
์ผ์ชฝ์ ๋ณด๋ฉด ๋ง์นจํ 2๊ฐ๋ก ๋์ด์ ธ์ ์ด 3๋ถ๋ถ(xxxxx.yyyyy.zzzzz)์ผ๋ก ๋๋์ด์ง ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด 3๋ถ๋ถ์ ์ค๋ฅธ์ชฝ์ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ header, payload, verify signature๋ก ๊ตฌ๋ถ๋๋ค.
header๋ฅผ Base64๋ก ๋์ฝ๋ฉ 2๊ฐ์ง ์ ๋ณด๊ฐ ์๋ค. ์ด ์ ๋ณด๋ Base64Url๋ก ์ธ์ฝ๋ฉ๋๋ค.
{
"alg": "HS256",
"typ": "JWT"
}
ํ ํฐ์ ํ์
์ธ์ ๋ JWT๊ฐ ๋ค์ด๊ฐ๋ค.
alg
์๊ณ ๋ฆฌ์ฆ์ ์ฝ์์ด๋ค. verify signature๋ฅผ ๋ง๋๋๋ฐ ์ฌ์ฉ๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ(HS256 ๋ฑ)์ด ์ง์ ๋๋ค.
payload๋ฅผ Base64๋ก ๋์ฝ๋ฉํด๋ณด๋ฉด JSON ํ์์ผ๋ก ์ฌ๋ฌ ์ ๋ณด๋ค์ด ๋ค์ด์๋ค. ์ด ์ ๋ณด๋ Base64Url๋ก ์ธ์ฝ๋ฉ๋๋ค.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
ํ ํฐ์ ๋ด๊ธด ์ด ์ ๋ณด๋ฅผ claim์ด๋ผ๊ณ ํ๋๋ฐ, ํ ํฐ์ ๋๊ฐ ๋๊ตฌ์๊ฒ ๋ฐ๊ธํ๋์ง, ์ด ํ ํฐ์ด ์ธ์ ๊น์ง ์ ํจํ์ง, ์๋น์ค๊ฐ ์ฌ์ฉ์์๊ฒ ์ด ํ ํฐ์ ํตํด์ ๊ณต๊ฐํ๊ธฐ ์ํ๋ ๋ด์ฉ(Ex) ์ฌ์ฉ์์ ๋๋ค์, ๊ด๋ฆฌ์ ์ฌ๋ถ ๋ฑ) ๋ฑ ์ฌ์ฉ์์ ์ ๋ณด๊ฐ ๋ค์ด์๋ค. ํด๋ ์์ ์ฌ์ฉ์ ์ ๋ณด๋ ํ ํฐ ์์ฑ ๋ฑ์ ๋ํ๋ด๋ key-value ์์ด๋ค.
ํ์ง๋ง ์ด ๋ถ๋ถ์ ๋ค๋ฅธ ์ ๋ณด๋ก ๋ฐ๊พธ๊ฑฐ๋ ์ ์ฉํ ์ฐ๋ ค๊ฐ ์๋ค. ๊ทธ๋์ header์ verify signature๊ฐ ์๋ ๊ฒ์ด๋ค.
ํ ํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
header์์ ์๋ ์ํธํ ์๊ณ ๋ฆฌ์ฆ(์ธ์ฝ๋ฉ๋ header + ์ธ์ฝ๋ฉ๋ payload + ์๋ฒ์ ๋น๋ฐํค) = verify signature
์๋ฒ๋ ์ ๊ณผ์ ์ ๋ฐ๋ผ์ verify signature๋ฅผ ๋ง๋ค๊ณ , ํ ํฐ๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ค. ์ด ๋ฐ๋ผ์, ์๋ฒ์ ๋น๋ฐํค๋ฅผ ๋ชจ๋ฅด๋ฉด ์๋ฌด๋ฆฌ payload๋ฅผ ํ์ทจํด์ ๋ฐ๊พธ๋๋ผ๋ ์ธ๊ฐ์ ํต๊ณผํ์ง ๋ชปํ๋ค!
์ฆ, ๋๊ฐ์ด ๋ก๊ทธ์ธ์ ํ์ง๋ง ์ธ์
๊ณผ ๋ฌ๋ฆฌ JWT๋ DB๋ฅผ ๊ฑด๋๋ฆฌ๋ ๋์ ์ ๋ณด๋ฅผ ์ฌ์ธํ๊ณ ์ ๋ฌํ๋ค.
์ด์ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ์ธ์
ID์ ๋น์ทํ๊ฒ (์ฌ์ธ๋ ์ ๋ณด or ํ ํฐ)์ ์๋ฒ์ ๋ณด๋ด์ผ ํ๋ค. ์๋ฒ๋ ํ ํฐ์ ๋ฐ์ผ๋ฉด ํด๋น ์ฌ์ธ์ด ์ ํจํ์ง ์ฒดํฌํ๊ณ (ํ ํฐ์ด ์กฐ์๋์๋์ง ์ฒดํฌ), ํ ํฐ์ด ์ ํจํ๋ค๋ฉด ์๋ฒ๋ ํด๋น ์์ฒญ์ ์ ์ ๋ก ์ธ์ฆํ ๊ฒ์ด๋ค!
JWT์์ ์ ์ ๋ฅผ ์ธ์ฆํ๋๋ฐ ํ์ํ ์ ๋ณด๋ฅผ ํ ํฐ์ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด, DB๋ฅผ ๋ค์ง ํ์๋ ์์ด ํด๋น ํ ํฐ์ด ์ ํจํ์ง๋ง ๊ฒ์ฆํ๋ฉด ๋๋ค. ์ผ๋ํด์ผ ํ ๊ฒ์ JWT๋ ์ํธํ๋์ง ์์๋ค. ๋ฐ๋ผ์ ๋น๋ฐ ์ ๋ณด ๊ฐ์ ๊ฒฝ์ฐ๋ JWT์์ ๋ฌ์๋ ์๋๋ค.
๐ค ์๋น์ค๊ฐ ์๊ฑฐ๋ ์ ์ ์ ๋ณด๋ฅผ ํ์ฉ or ๊ด๋ฆฌํ ํ์๊ฐ ์์๋๋ ์ธ์ ๋ณด๋จ JWT๊ฐ ๋ ์ ์ฉํ ๊ฒ ๊ฐ๋ค!
์ธ์ vs ํ ํฐ vs ์ฟ ํค? ๊ธฐ์ด๊ฐ๋ ์ก์๋๋ฆผ. 10๋ถ ์์ญ!
์ฟ ํค, ์ธ์ , ์บ์๊ฐ ๋ญ๊ฐ์?
[10๋ถ ํ ์ฝํก] ์ฐ๋ก๊ทธ์ ์ฟ ํค vs ์ธ์ vs ํ ํฐ vs ์บ์