nextjs,tailwindcss,vercel

[์ธ์ฆ] ์„ธ์…˜, ์ฟ ํ‚ค,jwt, ํ† ํฐ ์ •๋ฆฌ (nextjs getSession, jwt)

์ฃผ์˜ ๐Ÿฑ 2024. 7. 15. 16:53
728x90

๊ตฌ๊ธ€๋กœ๊ทธ์ธ ๊ตฌํ˜„ ํ›„ vercel์— deployํ–ˆ๋Š”๋ฐ middleware์—๋Š” SSR์ธ getsession์„ ์“ธ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์™”๋‹ค. 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์›น ์—ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค. 

[ ์ธ์ฆ์ด๋ž€? ]

์ธ์ฆ๊ณผ ์ธ๊ฐ€์— ๋Œ€ํ•ด ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. 

 

Authentication - ์ธ์ฆ

- ์œ ์ €์‹๋ณ„, ์‹ ์›๊ฒ€์ฆ , ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

 

Authorization - ์ธ๊ฐ€

- ์ธ์ฆ ํ›„, ์œ ์ €๊ฐ€ ์–ด๋””๊นŒ์ง€ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ๋ฝํ•  ๊ฒƒ์ธ๊ฐ€

- ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์œ ์ €๋งŒ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์—‘์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

[์ฟ ํ‚ค์™€ ์„ธ์…˜]

์ฟ ํ‚ค

์„œ๋ฒ„ -> ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•ด ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•  ์ž‘์€ ํŒŒ์ผ

๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)๋Š” ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ์‹œ ๊ฐ™์ด ์ „์†กํ•จ

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์•„์ด๋””, ๋น„๋ฒˆ์„ ์ฟ ํ‚ค์— ๋‹ด์•„ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ๋‹ค. ๋งค๋ฒˆ ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„๋Š” ๋กœ๊ทธ์ธ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์ฟ ํ‚ค๋ฅผ ๋ฐ›๋Š”๋‹ค

๋งค๋ฒˆ ์š”์ฒญ์— ์‚ฌ์šฉ์ž์ •๋ณด๋‹ด์€ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด๊ธฐ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ์˜ ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค. ์ฟ ํ‚ค๊ฐ€ ์ปค์ง€๋ฉด ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•ด์ง„๋‹ค. 

ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฟ ํ‚ค๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

์„ธ์…˜

์ฟ ํ‚ค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์„œ๋ฒ„์—์„œ ์ผ์ •์‹œ๊ฐ„๋™์•ˆ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค. 

์ฟ ํ‚ค์™€ ๋น„๊ตํ•˜๋ฉฐ ์ฐจ์ด์  ๋น„๊ต

 

  • ์ €์žฅ ์œ„์น˜:
    • ์ฟ ํ‚ค: ํด๋ผ์ด์–ธํŠธ ์ธก(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์„œ๋ฒ„ ์ธก์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ:
    • ์ฟ ํ‚ค: ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด ์ƒ๋Œ€์ ์œผ๋กœ ๋œ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋ช…:
    • ์ฟ ํ‚ค: ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ซํ˜€๋„ ์œ ์ง€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ซํžˆ๋ฉด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํฌ๊ธฐ ์ œํ•œ:
    • ์ฟ ํ‚ค: ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ 4KB ์ •๋„๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ํ•ด์„œ๋งŒ ์ œํ•œ๋˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ „์†ก:
    • ์ฟ ํ‚ค: ๋ชจ๋“  HTTP ์š”์ฒญ์— ํ•จ๊ป˜ ์ „์†ก๋˜์–ด ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์„ธ์…˜ ID๋งŒ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์— ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๋ชฉ์ :
    • ์ฟ ํ‚ค: ์‚ฌ์šฉ์ž ์„ ํ˜ธ ์„ค์ •, ํŠธ๋ž˜ํ‚น, ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ •๋ณด ๋“ฑ ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„ ๋ฐฉ์‹:
    • ์ฟ ํ‚ค: ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฉฐ, ์„œ๋ฒ„์—์„œ Set-Cookie ํ—ค๋”๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์„œ๋ฒ„ ์ธก ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ:
    • ์ฟ ํ‚ค: JavaScript๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ง์ ‘ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ์„ธ์…˜: ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ์ƒ๊น€์ƒˆ?

  1. ์ฟ ํ‚ค์˜ ์ƒ๊น€์ƒˆ:

์ฟ ํ‚ค๋Š” ํ…์ŠคํŠธ ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๋กœ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

 

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๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ

 

๋ฐ˜์‘ํ˜•