ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT vs Session & Cookie ์ธ์ฆ ์ธ๊ฐ€ ๋ฐฉ์‹?! (feat. ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ฟ ํ‚ค)
    ๐ŸŽ Browser 2023. 8. 27. 21:50

    ๐ŸŽ ๋ฐฐ๊ฒฝ

    ํ˜„์žฌ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ ์•ฑ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ ์ค‘์ด๋‹ค. ๊ธฐ์กด์˜ jwt ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ/์ธ๊ฐ€ ๋ฐฉ์‹์—์„œ Session Cookie ๊ธฐ๋ฐ˜์˜ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ๊ณผ ๊ฐ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒ์„ ๋‚ด๋ ธ๊ณ , ๊ทธ ๊ณผ์ • ์–ป์€ ์ง€์‹๊ณผ ๊ฒฐ์ • ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

     

     

    ๐ŸŽ ์ฝ๊ธฐ ์ „ ์šฉ์–ด ์ •๋ฆฌ

    ๊ฐ„๋‹จํ•˜๊ฒŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ์ดํ•ด์— ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค. 

    ์ธ์ฆ == Authentication โ‰’ ๋กœ๊ทธ์ธ

    ์ธ๊ฐ€ == Authorization โ‰’ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ํ—ˆ๋ฝํ•ด ์ฃผ๋Š” ๊ฒƒ

     

     

     

    ๐ŸŽ Session Cookie ์ธ์ฆ/์ธ๊ฐ€ ๋ฐฉ์‹

    1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•œ๋‹ค.
    2. ์‚ฌ์šฉ์ž์˜ ์‹ค์ œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„œ๋ฒ„ ์ธก ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•œ๋‹ค.
    3. ์‚ฌ์šฉ์ž์—๊ฒŒ ์ €์žฅ๋œ ์„ธ์…˜ ์ •๋ณด์˜ ์‹๋ณ„์ž์ธ session id๋ฅผ ๋ฐœ๊ธ‰ํ•œ๋‹ค.
    4. ๋ฐœ๊ธ‰ํ•œ session id๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ฟ ํ‚ค ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
    5. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ถ”๊ฐ€๋กœ ์„ค์ •ํ•ด์ค„ ํ•„์š” ์—†์ด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ์š”์ฒญ๋งˆ๋‹ค http cookie ํ—ค๋”์— session id๊ฐ€ ์„œ๋ฒ„๋กœ ํ•จ๊ป˜ ์ „์†ก๋œ๋‹ค.
    6. session id๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ ํŒ๋ณ„ํ•œ๋‹ค.

     

     

    ๐ŸŽ Session Cookie ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ 

    1์–ต ๋ช…์˜ ์œ ์ €๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์˜ฌ๋ผ์™€ ์žˆ๋‹ค๋ฉด ์ „๋‹ฌ๋ฐ›์€ session id๋กœ ์œ ์ €๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณผ์ •์€ ์„œ๋ฒ„์— ํฐ ๋ฌด๋ฆฌ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค์˜ ๊ทœ๋ชจ๊ฐ€ ์ƒ๊ธฐ๊ณ , ์š”์ฒญ์„ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„๋ฅผ ๋‘๊ณ  ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์˜จ๋‹ค๋ฉด? ์–ด๋–ค ๋กœ๊ทธ์ธ ์š”์ฒญ์€ ์„œ๋ฒ„ 1๋ฒˆ์œผ๋กœ, ๋‚ด ํ”„๋กœํ•„ ์ ‘์† ์š”์ฒญ์€ ์„œ๋ฒ„ 3๋ฒˆ์œผ๋กœ ๊ฐ€๊ฒŒ ๋˜๋ฉด, ์„œ๋ฒ„ 1๋ฒˆ ์š”์ฒญ์—์„œ ์ƒ์„ฑํ•œ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ์„œ๋ฒ„ 3๋ฒˆ์ด ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ์„ธ์…˜์ด ์œ ์ง€๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋Ÿฌํ•œ ๋น„์šฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ์ธ๊ฐ€ ๋ฐฉ์‹์ด ๋ฐ”๋กœ ๋šœ๋‘ฅ JWT ํ† ํฐ ๋ฐฉ์‹์ด๋‹ค!

    (*๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ฟ ํ‚ค๊ฐ€ ๋ญ”๊ฐ€์š”? ํ•˜๋‹จ ๐ŸŽ (๋ธŒ๋ผ์šฐ์ €์—์„œ์˜) ์ฟ ํ‚ค ์„น์…˜์„ ๋จผ์ € ์ฝ์–ด์ฃผ์„ธ์š”!)

     

     

     

    ๐ŸŽ JWT ์ธ์ฆ/์ธ๊ฐ€ ๋ฐฉ์‹

    1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•œ๋‹ค.
    2. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ ์ •๋ณด๊ฐ€ ์ธ์ฝ”๋”ฉ๋œ ํ˜•ํƒœ์˜ jwt ํ† ํฐ์„ ์ „๋‹ฌํ•œ๋‹ค. (SECRET KEY๋Š” ์„œ๋ฒ„์— ๊ฐ์ถฐ๋†“์€ ์ƒํƒœ)
      1. header > type (ํ† ํฐ ํƒ€์ž…), alg (ํ•˜๋‹จ verify signature๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์•Œ๊ณ ๋ฆฌ์ฆ˜)
      2. payload: ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ํ† ํฐ์œผ๋กœ ๊ณต๊ฐœํ•˜๊ธฐ ์›ํ•˜๋Š” ๋‚ด์šฉ
      3. verify signature
    3. ํด๋ผ์ด์–ธํŠธ์—์„œ jwt ํ† ํฐ์„ ํ—ค๋”์— ๋‹ด์•„ ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.
    4. ์„œ๋ฒ„์— ๊ฐ์ถฐ๋†“์€ SECRET KEY์™€ ํ•จ๊ป˜, header & payload ๊ฐ’์„ ๊ณ„์‚ฐํ•ด verify signature์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋ถˆ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ํ† ํฐ์ด ์กฐ์ž‘๋˜์—ˆ๋‹ค๊ณ  ๋ณธ๋‹ค.

     

     

    ๐ŸŽ JWT ์ธ์ฆ/์ธ๊ฐ€ ๋ฐฉ์‹์˜ ๋ณด์™„: Access, Refresh ํ† ํฐ ๋ฐœ๊ธ‰

    JWT ๋ฐฉ์‹์€ ์œ ์ €๊ฐ€ ํ† ํฐ์„ ์žƒ์–ด๋ฒ„๋ฆฌ๋ฉด ํ†ต์ œ๊ถŒ์„ ์žƒ๊ณ , ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ๋„ˆ๋ฌด ์งง๊ฒŒ ์žก์œผ๋ฉด ๋งค๋ฒˆ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋ฐฉ์‹์ด๋‹ค.

    1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•œ๋‹ค.
    2. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ access ํ† ํฐ๊ณผ, refresh ํ† ํฐ์„ ์ „๋‹ฌํ•œ๋‹ค. (*access ํ† ํฐ: ๋กœ๊ทธ์ธ ํ›„ ๋ช‡ ๋ถ„ ~์‹œ๊ฐ„ ๋™์•ˆ ์œ ํšจํ•œ ํ† ํฐ, refresh ํ† ํฐ: ๋ฐœ๊ธ‰ ํ›„ ํ†ต์ƒ 2์ฃผ๊ฐ„ ๋ณด์กด๋œ๋‹ค. access ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. )
    3. refresh ํ† ํฐ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ DB์— ์ €์žฅํ•œ๋‹ค.
    4. ํด๋ผ์ด์–ธํŠธ๋Š” access ํ† ํฐ์ด ์ˆ˜๋ช…์„ ๋‹คํ•˜๋ฉด refresh ํ† ํฐ์„ ์ „๋‹ฌํ•œ๋‹ค.
    5. refresh ํ† ํฐ์„ ๋Œ€์กฐํ•˜์—ฌ ๋งž๋‹ค๋ฉด ์ƒˆ๋กœ์šด access ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.

    ์ค‘๊ฐ„์— refresh ํ† ํฐ์ด ํƒˆ์ทจ๋˜์—ˆ๋‹ค๋ฉด, ํ•ด๋‹น refresh ํ† ํฐ์„ ์ „๋‹ฌ๋ฐ›์•˜์„ ๋•Œ access ํ† ํฐ ๋ฐœ๊ธ‰์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค!

    ์ด๋ ‡๊ฒŒ ์„œ๋ฒ„ ์ธก์—์„œ ๋กœ๊ทธ์ธ์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๊ณ ,

    ์„œ๋ฒ„์—๋Š” ํฐ ๋ฌด๋ฆฌ๊ฐ€ ๊ฐ€์ง€ ์•Š์œผ๋ฉด์„œ ๋งค๋ฒˆ ๋กœ๊ทธ์ธํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ์™„ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    ๐ŸŽ ๊ทธ๋Ÿฐ๋ฐ ์™œ Session Cookie ๋ฐฉ์‹ ๊ณ ๋ฅด์…จ๋‚˜์š”?!

     

    ํฌ๊ธฐํ•ด์•ผ ํ•˜๋Š” ์žฅ์ ๊ณผ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์„ธ์…˜ ์ฟ ํ‚ค ๋ฐฉ์‹์„ ๋„์ž…ํ•ด์•ผ๋งŒ ํ–ˆ๋˜ ์ด์œ ๋Š”, ๋น„์šฉ์ ์ธ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋งŒ์„ ๊ณ ๋ คํ–ˆ๋‹ค๊ธฐ๋ณด๋‹ค ๋ฐ”๋กœ ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ด์—ˆ๋‹ค…

     

    1. ๋ฉ€ํ‹ฐ ๋กœ๊ทธ์ธ ๊ธˆ์ง€
      PC์—์„œ ๋กœ๊ทธ์ธ๋˜์—ˆ๋‹ค๋ฉด ๋ชจ๋ฐ”์ผ์—์„œ ๋กœ๊ทธ์•„์›ƒ๋˜๋„๋ก ๋ฉ€ํ‹ฐ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•˜์—ฌ์•ผํ–ˆ๊ณ , ํ•œ ์„ธ์…˜์ด ์ƒ์„ฑ๋˜๋ฉด ์œ ์ € Session ID ์ •๋ณด ์ผ๋ถ€๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์„ธ์…˜์„ ์‚ญ์ œํ•˜์—ฌ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. JWT ํ† ํฐ์€ ์ด๋ฏธ ๋ฐœ๊ธ‰๋ฐ›์€ ์œ ์ €๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ๋กœ SECRET KEY๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ์ด๋ฏธ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฅผ ๋ฌด๋ ฅํ™” ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค.
    2. remember me ๊ธฐ๋Šฅ
      ์›น์•ฑ ๋‚ด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ์˜ต์…˜ ์„ ํƒ ์‹œ ์ฟ ํ‚ค๊ฐ€ ๋งŒ๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ๋ฏธ๋ž˜๋กœ ์„ค์ •ํ•˜์—ฌ stay sign in ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. JWT ์ธ๊ฐ€ ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ ํ† ํฐ์˜ ์ˆ˜๋ช…์„ ๋Š˜๋ ค remember me ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ธ์ฆ ์—ฌ๋ถ€๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ† ํฐ์€ ์œ ์ €๊ฐ€ ๊ฐ–๊ณ  ์žˆ๊ธฐ์— ํ•ด๋‹น ํ† ํฐ์˜ ์ˆ˜๋ช… ๋™์•ˆ ์„œ๋ฒ„ ์ธก์—์„œ ํ†ต์ œํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๋ณด์•ˆ์ƒ์˜ ์ทจ์•ฝ์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

     

     

    ๐ŸŽ [์ถ”๊ฐ€] (๋ธŒ๋ผ์šฐ์ €์—์„œ์˜) ์ฟ ํ‚ค

    ์ฟ ํ‚ค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋งฅ๋ฝ์—์„œ ๋‹ค๋ฅธ ๋Œ€์ƒ์„ ์ง€์นญํ•˜๋Š” ์šฉ์–ด๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๊ธฐ์—… ์—ฌ๊ธฐ์„œ๋Š” ‘๋ธŒ๋ผ์šฐ์ €์—์„œ์˜’ ์ฟ ํ‚ค๋งŒ์„ ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

     

    ์ฟ ํ‚ค ํŠน์ง•

    • ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋Š” ์ž‘์€ ๋ฌธ์ž์—ด
      • 4KB๋ฅผ ๋„˜์„ ์ˆ˜ ์—†์Œ
      • key: value; ๋ฌธ์ž์—ด๋กœ ์ €์žฅ๋˜๋Š”๋ฐ ์•ฝ 20์—ฌ ๊ฐœ๋กœ ์ œํ•œ
      • e.g. name=value; name2=value2; name3=value3; ํ˜•ํƒœ๋กœ ์ €์žฅ
    • ์›น ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด์ง. ์‘๋‹ต ํ—ค๋”์— set-cookie ๋‚ด์šฉ์„ ๋„ฃ์–ด ์ „๋‹ฌ
    • ์ „๋‹ฌ๋ฐ›์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž์ฒด์ ์œผ๋กœ ์ €์žฅ ํ›„ ์š”์ฒญ๋งˆ๋‹ค ํ—ค๋”์— ๋„ฃ์–ด ์ €์žฅํ•œ๋‹ค

    ์‚ฌ์šฉ์ฒ˜

    • ํด๋ผ์ด์–ธํŠธ ์‹๋ณ„ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•จ
    • ๋กœ๊ทธ์ธ / ์žฅ๋ฐ”๊ตฌ๋‹ˆ / ๊ฐœ์ธํ™” (์‚ฌ์šฉ์ž ๋งž์ถค ํ…Œ๋งˆ, ์–ธ์–ด ๋“ฑ) / ํŠธ๋ž˜ํ‚น (์‚ฌ์šฉ์ž ํ–‰๋™ ๊ธฐ๋ก ๋ฐ ๋ถ„์„)

    ์ฟ ํ‚ค ์ถ”๊ฐ€ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

    document.cookie = "<<์ฟ ํ‚ค ๋ฌธ์ž์—ด>>" // --- ์ฟ ํ‚ค ์ถ”๊ฐ€
    document.cookie // -- ์ฟ ํ‚ค ์ฝ๊ธฐ 
    

    ์ฃผ์˜

    • ์ผ๊ด€๋œ ํ˜•์‹์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ encodeURIComponent๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    let name = "my name";
    let value = "John Smith"
    
    document.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value); // -- ๊ณต๋ฐฑ ์ธ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ 
    
    alert(document.cookie); // ...; my%20name=John%20Smith
    

    ์ฟ ํ‚ค ์˜ต์…˜? ์„ธํŒ… ๋ฐฉ๋ฒ•?

    • "/posting" ๊ฒฝ๋กœ ํ˜น์€ ํ•˜์œ„ ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŽ˜์ด์ง€๋งŒ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด? <<path=/ํ•˜์œ„๊ฒฝ๋กœ>>
      path=/posting
    • ์ฟ ํ‚ค์— ํด๋ผ์ด์–ธํŠธ ๋ฐฐํฌ url (example.com)๋งŒ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
      domain=example.com
    • ์ฟ ํ‚ค์˜ ์œ ํšจ์ผ์ž ํ˜น์€ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด?
      expires | max-age ์˜ต์…˜ ํ™•์ธ (๋‹จ, ๋ฐ˜๋“œ์‹œ toUTCString ํฌ๋งท ์‚ฌ์šฉ)
    // ์ง€๊ธˆ์œผ๋กœ๋ถ€ํ„ฐ ํ•˜๋ฃจ ํ›„
    let date = new Date(Date.now() + 86400e3);
    date = date.toUTCString();
    document.cookie = "user=John; expires=" + date;
    
    • https๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ฟ ๊ธฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
      secure
    • ์‚ฌ์ดํŠธ ์™ธ๋ถ€์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ์ฐจ๋‹จํ•˜๋ ค๋ฉด? (XSRF ๊ณต๊ฒฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด)
      samesite=strict ์˜ต์…˜์„ ์ฃผ์–ด ๊ฐ™์€ ์‚ฌ์ดํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œ.
    • ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ document.cookie๋กœ ์ฟ ํ‚ค๋ฅผ ๊บผ๋‚ด ๋ณด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?
      httpOnly

     

     

    ๐ŸŽ Session Cookie ๋ฐฉ์‹ - ๋ธŒ๋ผ์šฐ์ € ์ฒ˜๋ฆฌ ์ฝ”๋“œ

    ํ”„๋กœ์ ํŠธ ๋‚ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  api ์š”์ฒญ์˜ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜์ด๋‹ค.

    ์‚ฌ์šฉ์ž๊ฐ€ ์ธ๊ฐ€๋ฐ›์€ ์œ ์ €์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ์‹œ์ ์€ ์„œ๋ฒ„ ์ธก ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ์ƒํƒœ์ฝ”๋“œ๊ฐ€ 401 (์ธ์ฆ ์ธ๊ฐ€ ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ) ์ผ ๋•Œ์ด๋‹ค. ์œ ํ‹ธ ํ•จ์ˆ˜์— ์ƒํƒœ ์ฝ”๋“œ ๋ณ„ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ผ๊ด„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. 

    type Callback<T> = (...args: any[]) => Promise<T>;
    
    export const methodFormat = <T>(callback: Callback<T>) => {
      const method = async (
        ...args: any[]
      ): Promise<{ ok: boolean; data?: T; message?: string }> => {
        try {
          const data = await callback(...args);
          return {
            ok: true,
            data,
          };
        } catch (error: any) {
          if (error.response.status === 401) { // -- 401 ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ 
            window.href = "/login" // -- login ํŽ˜์ด์ง€๋กœ redirect
          } 
          return {
            ok: false,
            message: error.message,
          };
        }
      };
      return method;
    };
    

     

     

    ๐ŸŽ ํ•œ ์ค„ ๋А๋‚Œ

    ๋‚˜์˜จ ์ง€ 20๋…„์ด ์ง€๋‚œ ์„ธ์…˜ ์ฟ ํ‚ค ๋ฐฉ์‹์„ ์•„์ง๊นŒ์ง€ ๋ชจ๋“  ์›น์˜ 90%๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์‹ค์„œ๋น„์Šค ์ค‘ JWT๋งŒ์œผ๋กœ ์ธ๊ฐ€๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ํ•œ๋‹ค. JWT๊ฐ€ ์ •๋ง ์ข‹์€ ๋ฐฉ์‹์ด๋ฉด ๋„ˆ๋„ ๋‚˜๋„ ์จ์•ผ ํ•˜์ง€ ์•Š์„๊นŒ  ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค 

    ๋„-์•

     

     

     

     

     

    ์ฐธ๊ณ ์ž๋ฃŒ:

    https://ko.javascript.info/cookie

    https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies

    https://www.youtube.com/watch?v=1QiOXWEbqYQ

Designed by Tistory.