Cookie, Session, Token, JWT, Spring Security
์ฟ ํค๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋ ๋ชฉ์ ์ผ๋ก ์์ฑํ key-value ํ์์ ๋ฌธ์์ด ๋ฉ์ด๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
HTTP๋ Stateless ๋ฌด์ํ, Connectionless ๋น์ฐ๊ฒฐ์ฑ์ ํน์ฑ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์, ์ํ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ฒ๋ ์๋ต ํค๋์ Set-Cookie์ ์ ๋ณด๋ฅผ ๋ด๊ณ , ์ดํ ํด๋ผ์ด์ธํธ๋ ๋งค๋ฒ ์ ์ฅ๋ ์ฟ ํค๋ฅผ ์์ฒญ ํค๋์ ๋ด์ ๋ณด๋
๋๋ค.
์๋ฒ๋ ์ฟ ํค์ ๋ด๊ธด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฐ์ง ์๋ณํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ถ์ฒ ๊ด๊ณ ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
๊ฐ ์ฌ์ฉ์์ ๊ณ ์ ์ ๋ณด ์ ์ถ ๋ฐ ์กฐ์ ์ํ์ด ์์ด ๋ณด์์ ์ทจ์ฝํฉ๋๋ค.
๋ํ ์ฉ๋ ์ ํ์ด ์๊ณ , ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ฟ ํค์ ๊ฐ์ด ์ํ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋์ง๋ง,
๋ค๋ฅธ ์ ์ ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ธ์
ID๋ฅผ ๋ถ์ฌํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ข
๋ฃ๋๊ธฐ ์ ๊น์ง ์ํ ์ ๋ณด๋ฅผ ์ ์งํ๊ฒ ๋ฉ๋๋ค.
์ฆ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์๋ฒ ์ธก์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
์ ์ ๊ฐ ์น์ฌ์ดํธ์ ์ ์ํ๋ฉด ์ธ์
์ด ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ณ , ๋ถ์ฌ๋ Session ID๋ฅผ ๋ธ๋ผ์ฐ์ ์ฟ ํค์ ์ ์ฅํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ํด๋น ์ฌ์ดํธ์ ๋ํ ๋ชจ๋ Request์ Session ID๋ฅผ ์ฟ ํค์ ๋ด์ ์ ์กํ๊ณ , ์๋ฒ๋ ๊ทธ ๊ฐ์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ์ธ์ฆ์ ์ํํฉ๋๋ค.
ํ์ง๋ง ์ฌ์ ํ Session ID์ ํ์ทจ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณด์ ๋ฌธ์ ๊ฐ ๋จ์์๊ณ ,
์๋ฒ์์ ์ธ์
์ ์ฅ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์์ฒญ์ด ๋ง์์ง๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ์ฌํด์ง ์ ์์ต๋๋ค.
ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์ํ์ ๋ ์ธ์ฆ๋์๋ค๋ ์๋ฏธ๋ก ํ ํฐ์ ๋ถ์ฌ๋ฐ๋ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค.
์ด ํ ํฐ์ ์ ์ผํ ๊ฐ์ผ๋ก, ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณํ ์ ์๋ ๊ฐ์
๋๋ค.
๊ธฐ์กด ์ธ์
๊ธฐ๋ฐ ์ธ์ฆ์ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์
์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ด๋ฅผ ์กฐํํ๋ ๊ณผ์ ์ผ๋ก ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ง๋ง,
ํ ํฐ์ ์์ฒด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๊ณ ์์กฐ ํ๋ณ๋ง ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ๋ถ๋ด์ ๋ ์ ์์ต๋๋ค.
์ด ๋ฐฉ์์ ๋ก๊ทธ์ธ ์ ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ฐฉ์์
๋๋ค.
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด ์๋ฒ ์ธก์์ ํ ํฐ์ ๋ฐ์ํ๊ณ , ํด๋ผ์ด์ธํธ์์๋ ์ด ํ ํฐ์ ์ฟ ํค๋ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ ํ HTTP ์์ฒญ ํค๋์ ํฌํจ์์ผ ๋งค๋ฒ ์์ฒญ์ ์ํํฉ๋๋ค.
์๋ฒ๋ ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์๋ตํ๊ฒ ๋ฉ๋๋ค.
ํ ํฐ ์์ฒด์ ์์ฒญํ ์ฌ๋์ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์๊ธฐ ๋๋ฌธ์ DB๋ฅผ ์กฐํํ์ง ์๊ณ ๋ ์ ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
ํ์ง๋ง ํ ํฐ์ ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ ๊ธธ์ด, ์์ฒญ์ด ๋ง์์ง๋ฉด ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฌํด์ง ์ ์์ต๋๋ค.
๋ํ Payload ์์ฒด๋ ์ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ ์ค์ํ ์ ๋ณด๋ฅผ ๋ด์ ์ ์์ต๋๋ค.
ํ ํฐ ํ์ทจ ์ํ์ฑ์ด ์๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๋๋นํ๊ธฐ ์ํด ์ฌ์ฉ ๊ธฐ๊ฐ ์ ํ์ ์ค์ ํ๋ ์์ผ๋ก ๊ทน๋ณตํ ์ ์์ต๋๋ค.
JWT๋ ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ JSON ํ ํฐ์ ์๋ฏธํฉ๋๋ค.
JSON ๋ฐ์ดํฐ๋ฅผ Base64 URL-safe Encode ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉํ์ฌ ์ง๋ ฌํํ ๊ฒ์
๋๋ค.
์๋ณ์กฐ ๋ฐฉ์ง๋ฅผ ์ํ ๊ฐ์ธํค ์ ์์๋ช
๋ ํฌํจ๋์ด ์์ด, ์๋ฒ์์๋ ์๋ช
์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
๐ก Base64 URL-safe Encode
์ผ๋ฐ์ ์ธ Base64 Encode ์์ URL ์์ ์ค๋ฅ์์ด ์ฌ์ฉํ๋๋ก '+', '/' ๋ฅผ ๊ฐ๊ฐ '-', '_' ๋ก ํํํ ๊ฒ์ด๋ค.
JWT๋ Header, Payload, Signature๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
ํค๋์๋ JWT์์ ์ฌ์ฉํ ํ์
๊ณผ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข
๋ฅ๊ฐ ๋ด๊ฒจ ์์ต๋๋ค.
{
"alg": "HS256", // ์๋ช
์ํธํ ์๊ณ ๋ฆฌ์ฆ ex. HMAC SHA256, RSA
"typ": "JWT" // ํ ํฐ ์ ํ
}
ํ์ด๋ก๋์๋ ์๋ฒ์์ ์ฒจ๋ถํ ์ฌ์ฉ์ ๊ถํ ์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ ์์ต๋๋ค.
์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ์์คํ
์์ ์ค์ ๋ก ์ฌ์ฉ๋ ์ ๋ณด์ ๋ํ ๋ด์ฉ์ ๋ด๊ฒ ๋ฉ๋๋ค.
{
"sub": "1234",
"name": "JaeHui Kim",
"iat": 1344534634
}
์๊ทธ๋์ฒ ๋ถ๋ถ์๋ Header, PayloadFmf Base64 URL-safe Encode๋ฅผ ํ ์ดํ Header์ ๋ช
์๋ ํด์ํจ์๋ฅผ ์ ์ฉํ๊ณ ,
๊ฐ์ธํค Private key๋ก ์๋ช
ํ ์ ์์๋ช
์ด ๋ด๊ฒจ ์์ต๋๋ค.
HMACSHA256(
base54UrlEncode(header) + "." + base64UrlEncode(payload), 256-bit-secret-key
)
Spring Security๋ Spring ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
๋ณด์, ํนํ ์ธ์ฆ, ๊ถํ, ์ธ๊ฐ ๋ฑ์ ๋ด๋นํ๋ ์คํ๋ง ํ์ ํ๋ ์์ํฌ์
๋๋ค.
Dispatcher Servlet ๊ฐ๊ธฐ ์ ์ ๊ฐ์ฅ ๋จผ์ URL ์์ฒญ์ ๋ฐ๊ฒ ๋๋ Filter์์ ์ธ์ฆ๊ณผ ๊ถํ์ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.
์์ฒด์ ์ผ๋ก ๋ณด์๊ณผ ๊ด๋ จ๋ ๋ง์ ์ต์
์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์
์ฅ์์ ์ผ์ผ์ด ๊ด๋ จ ๋ก์ง์ ์์ฑํ์ง ์์๋ ๋๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๐ก ์ธ์ฆ Authentication
ํด๋น ์ฌ์ฉ์๊ฐ ๋ณธ์ธ์ด ๋ง๋์ง๋ฅผ ํ์ธํ๋ ์ ์ฐจ
๐ก ์ธ๊ฐ Authorization
์ธ์ฆ๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ ์์์ ์ ๊ทผ ๊ฐ๋ฅํ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ ์ฐจ
์ฆ, ์ธ์ฆ -> ์ฑ๊ณต -> ์ธ๊ฐ ์์๋ก ์งํ๋ฉ๋๋ค.