๊ตฌ๊ธ๋ก๊ทธ์ธ ๊ตฌํ ํ vercel์ deployํ๋๋ฐ middleware์๋ SSR์ธ getsession์ ์ธ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ์น ์ํ๋ฆฌ์ผ์ด์ ์ ์ธ์ฆ ๋ฐฉ์์ ๋ํด ๊ณต๋ถํ๋ค.
[ ์ธ์ฆ์ด๋? ]
์ธ์ฆ๊ณผ ์ธ๊ฐ์ ๋ํด ๊ตฌ๋ถํ ํ์๊ฐ ์๋ค.
Authentication - ์ธ์ฆ
- ์ ์ ์๋ณ, ์ ์๊ฒ์ฆ , ๋ก๊ทธ์ธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Authorization - ์ธ๊ฐ
- ์ธ์ฆ ํ, ์ ์ ๊ฐ ์ด๋๊น์ง ์ ๊ทผํ๋ ๊ฒ์ ํ๋ฝํ ๊ฒ์ธ๊ฐ
- ๊ด๋ฆฌ์ ๊ถํ์ ๊ฐ์ง ์ ์ ๋ง ๊ด๋ฆฌ์ ํ์ด์ง์ ์์ธ์คํ ์ ์๋ค.
[์ฟ ํค์ ์ธ์ ]
์ฟ ํค
์๋ฒ -> ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํด ํด๋ผ์ด์ธํธ์ ์ ์ฅํ ์์ ํ์ผ
๋ธ๋ผ์ฐ์ (ํด๋ผ์ด์ธํธ)๋ ๋ฐ์ ์ฟ ํค๋ฅผ ์์ฒญ์ ๊ฐ์ด ์ ์กํจ
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์๋ฒ๋ ์์ด๋, ๋น๋ฒ์ ์ฟ ํค์ ๋ด์ ์๋ฒ๋ก ๋ณด๋ธ๋ค. ๋งค๋ฒ ์ ์ ๊ฐ ๋ก๊ทธ์ธํ ๋๋ง๋ค ์๋ฒ๋ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋ด๊ธด ์ฟ ํค๋ฅผ ๋ฐ๋๋ค
๋งค๋ฒ ์์ฒญ์ ์ฌ์ฉ์์ ๋ณด๋ด์ ์ฟ ํค๋ฅผ ๋ณด๋ด๊ธฐ๋๋ฌธ์ ๋ณด์์์ ์ด์๊ฐ ์๋ค. ์ฟ ํค๊ฐ ์ปค์ง๋ฉด ๋คํธ์ํฌ ๋ถํ๊ฐ ์ฌํด์ง๋ค.
ํด๋ผ์ด์ธํธ์์ ์ฟ ํค๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
์ธ์
์ฟ ํค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ํ๋ฅผ ์ ์งํ๊ณ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์๋ฒ์์ ์ผ์ ์๊ฐ๋์ ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
์ฟ ํค์ ๋น๊ตํ๋ฉฐ ์ฐจ์ด์ ๋น๊ต
- ์ ์ฅ ์์น:
- ์ฟ ํค: ํด๋ผ์ด์ธํธ ์ธก(๋ธ๋ผ์ฐ์ )์ ์ ์ฅ๋ฉ๋๋ค.
- ์ธ์ : ์๋ฒ ์ธก์ ์ ์ฅ๋ฉ๋๋ค.
- ๋ณด์:
- ์ฟ ํค: ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์์ ํ ์ ์์ด ์๋์ ์ผ๋ก ๋ ์์ ํฉ๋๋ค.
- ์ธ์ : ์๋ฒ์ ์ ์ฅ๋์ด ํด๋ผ์ด์ธํธ์์ ์ง์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ๋ ์์ ํฉ๋๋ค.
- ์๋ช
:
- ์ฟ ํค: ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ ์ ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ๋ซํ๋ ์ ์ง๋ ์ ์์ต๋๋ค.
- ์ธ์ : ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ซํ๋ฉด ์ข ๋ฃ๋ฉ๋๋ค. ์๋ฒ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ํฌ๊ธฐ ์ ํ:
- ์ฟ ํค: ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก 4KB ์ ๋๋ก ์ ํ๋ฉ๋๋ค.
- ์ธ์ : ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ํด์๋ง ์ ํ๋๋ฏ๋ก ์๋์ ์ผ๋ก ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
- ์ ์ก:
- ์ฟ ํค: ๋ชจ๋ HTTP ์์ฒญ์ ํจ๊ป ์ ์ก๋์ด ๋คํธ์ํฌ ํธ๋ํฝ์ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
- ์ธ์ : ์ธ์ ID๋ง ์ฟ ํค๋ฅผ ํตํด ์ ์ก๋๊ณ , ์ค์ ๋ฐ์ดํฐ๋ ์๋ฒ์ ์ ์ง๋ฉ๋๋ค.
- ์ฌ์ฉ ๋ชฉ์ :
- ์ฟ ํค: ์ฌ์ฉ์ ์ ํธ ์ค์ , ํธ๋ํน, ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ธ์ : ๋ก๊ทธ์ธ ์ํ ์ ์ง, ์ฅ๋ฐ๊ตฌ๋ ์ ๋ณด ๋ฑ ๋ณด์์ด ํ์ํ ์์ ๋ฐ์ดํฐ ์ ์ฅ์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ตฌํ ๋ฐฉ์:
- ์ฟ ํค: ๋ธ๋ผ์ฐ์ ์ ์ํด ์๋์ผ๋ก ๊ด๋ฆฌ๋๋ฉฐ, ์๋ฒ์์ Set-Cookie ํค๋๋ฅผ ํตํด ์ค์ ํฉ๋๋ค.
- ์ธ์ : ์๋ฒ ์ธก ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ๋ ์์ํฌ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ๊ทผ:
- ์ฟ ํค: JavaScript๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ธก์์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
- ์ธ์ : ์๋ฒ ์ธก ์ฝ๋๋ฅผ ํตํด์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
์ฟ ํค์ ์ธ์ ์ ์๊น์?
- ์ฟ ํค์ ์๊น์:
์ฟ ํค๋ ํ ์คํธ ํํ์ ๋ฌธ์์ด๋ก, ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค:
name=value; expires=date; path=path; domain=domain_name; secure; HttpOnly
์์
user_id=12345; expires=Thu, 18 Dec 2023 12:00:00 UTC; path=/; domain=example.com; secure; HttpOnly
- name=value: ์ฟ ํค์ ์ด๋ฆ๊ณผ ๊ฐ
- expires: ์ฟ ํค์ ๋ง๋ฃ ๋ ์ง
- path: ์ฟ ํค๊ฐ ์ ํจํ ๊ฒฝ๋ก
- domain: ์ฟ ํค๊ฐ ์ ํจํ ๋๋ฉ์ธ
- secure: HTTPS์์๋ง ์ ์ก
- HttpOnly: JavaScript์์ ์ ๊ทผ ๋ถ๊ฐ
์ธ์ ๋ฐ์ดํฐ๋ ํค-๋ฒจ๋ฅ ์ ์ผ๋ก ์ ์ฅ๋๋ค.
{
"session_id": "ab12cd34ef56gh78",
"user_id": 12345,
"username": "john_doe",
"login_time": "2023-07-15T10:30:00Z",
"is_admin": false,
"cart": [
{ "product_id": 1, "quantity": 2 },
{ "product_id": 3, "quantity": 1 }
]
}
ํด๋ผ์ด์ธํธ ์ธก์์๋ ์ธ์ ID๋ง์ ์ฟ ํค๋ฅผ ํตํด ์ ์ฅํ๊ณ ์ ์ก
์์ฝํ๋ฉด, ์ฟ ํค๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๋ณผ ์ ์๋ ํ ์คํธ ํํ์ ๋ฌธ์์ด์ด๊ณ , ์ธ์ ์ ์๋ฒ์ ์ ์ฅ๋ ๊ฐ์ฒด ํํ์ ๋ฐ์ดํฐ
[ JWT ]
JSON Web Token
JWT ์ธ์ฆ์ ํ์ํ ์ ๋ณด๋ค์ ์ํธํ์ํจ ํ ํฐ
HTTP ํค๋์ ๋ด์์ผ๋ก์จ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ฅผ ์๋ณ
ํ ํฐ? - ์ฌ์ฉ์ ์ธ์ฆ์ ๋ณด๋ฅผ ๋ด์ ๋ฉ์์ง, ์๋ฒ๋ก๋ถํฐ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ ์์์ ์ฅํ๋ค.
์ธ์ฆ ํตํ ๋ก๊ทธ์ธ ์ฑ๊ณต์ ์๋ฒ๋ ์ธ์ฆ ์ ๋ณด๋ฅผ Payload์ ๋ด๊ณ , Secret Key๋ฅผ ์ฌ์ฉํด์ JWT์ ๋ฐ๊ธํ๋ค.
์๋ฒ๊ฐ JWT๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ฉด ํด๋ผ์ด์ธํธ๋ ํ ํฐ์ ์ฟ ํค๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง ๋ฑ์ ์ ์ฅํ๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ ํ ํฐ์ signature๋ฅผ Secret Key๋ก ๋ณตํธํํ ํ ์๋ณ์กฐ ์ฌ๋ถ ๋ฐ ์ ํจ๊ธฐ๊ฐ์ ๊ฒ์ฆํ๋ค. ์ฑ๊ณตํ๋ฉด, JWT์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์์ฒญ์ ์๋ตํ๋ค.
์์ ๋ก๊ทธ์ธ ํ ๋ ์ฌ์ฉํ๋ค.(ํด๋ผ์ด์ธํธ, ์๋ฒ๊ฐ ๋ค๋ฅธ ๋๋ฉ์ธ ์ฌ์ฉ) ๋์์ ์์๊ฐ ๋ง์ ๋ ์๋ฒ ๋ถํ๋ฅผ ๋ฎ์ถ๋ค. ์ธ์ฆ์ ๋ณด๋ฅผ ์๋ฒ์ ๋ณ๋ ์ ์ฅํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฌ๋, ๊ตฌํํ๊ธฐ ๋ณต์กํ๋ค.
๊ตฌ์กฐ
์ธ์ฝ๋ฉ๋ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ง๊ณ , ํค๋, payload, signature๋ก ๊ตฌ์ฑ๋์ด์๋ค.
1. ํค๋
{
"alg": "HS256",
"typ": "JWT"
}
ํ์ ๊ณผ ํด์ฑ์๊ณ ๋ฆฌ์ฆ ์ ์
2. payload
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
์ ์ ์ ๊ฐ์ ์ํฐํฐ ์ ์๋ฅผ ๋ด๊ณ ์๋ค.
3. signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
๊ฒ์ฆํ ๋ ์ฌ์ฉ, HMAC SHA256๋ฅผ ์ฌ์ฉํด์ signature๋ฅผ ๋ง๋๋ ์์