[React] JWT ํ† ํฐ๐Ÿ”

์ง€ํ—Œยท2024๋…„ 5์›” 30์ผ
0

๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ JWT์„ ํ†ตํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

๋กœ๊ทธ์ธ ์‹œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šค ํ† ํฐ์„ ์ „๋‹ฌ๋ฐ›๊ณ , ์‘๋‹ต ํ—ค๋”(Set-Cookie) ๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค์— ๋ฆฌํ”„๋ ˆ์‰ฌ ํ† ํฐ์„ ๋‹ด์•„ ์ „๋‹ฌ๋ฐ›์•˜๋‹ค.

๊ทธ ์ด์œ ๋Š” JWT๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Statelessํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๊ฐ€ ๋ณ„๋„์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š”๋ฐ ์ด๋Š” ํ† ํฐ์ด ํƒˆ์ทจ๋  ๊ฒฝ์šฐ ์ด๋ฅผ ๋ฌดํšจํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ์ ์„ ๋ณด์•ˆํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•˜๊ฒŒ trade-offํ•˜์—ฌ ์ผ๋ถ€๋ถ„์„ Statefulํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค.

JWT๋ฅผ Statefulํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๊ณ , ํ•„์š” ์‹œ ํ† ํฐ์„ ๋ฌดํšจํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํ•ด๋‹น ํ† ํฐ์„ ์ฆ‰์‹œ ํ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JWT ํ† ํฐ

JWT(Json Web Token) ์›นํ† ํฐ์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, ์ „์ž ์„œ๋ช…๋œ URL-safe์˜ JSON์ž…๋‹ˆ๋‹ค.

JWT ํ† ํฐ ์ธ์ฆ๋ฐฉ์‹์€ ๋น„๋ฐ€ํ‚ค(๊ฐœ์ธํ‚ค or ๋Œ€์นญํ‚ค)๋กœ ์•”ํ˜ธํ™”ํ•˜๋ฉฐ ์ด๋Š” JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ํ†ต์‹ ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

JWT๋Š” .์„ ๊ธฐ์ค€์œผ๋กœ header, payload, signature๋กœ ์„ธ ํŒŒํŠธ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

  1. ํ—ค๋”(Header)์—๋Š” JWT๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆ(์„œ๋ช… ์ƒ์„ฑ)ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์ธ ํ† ํฐ์˜ ํƒ€์ž…, ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํŽ˜์ด๋กœ๋“œ(Payload)์—๋Š” ํ† ํฐ์ด ์ „๋‹ฌํ•˜๋Š” ํด๋ ˆ์ž„ or ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” key - value์˜ ํ•œ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋ ˆ์ž„์„ ๋‹ด์„ ์ˆ˜ ์žˆ๊ณ , ํด๋ ˆ์ž„์„ public ํ˜น์€ privateํ• ๊ฑด์ง€ ๋“ฑ๋กํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. ์„œ๋ช…(Signature)์€ ํ—ค๋”(header)์™€ ํŽ˜์ด๋กœ๋“œ(Paylaod)๋ฅผ ํ•ฉ์นœ ๋ฌธ์ž์—ด์„ ์„œ๋ช…ํ•œ ๊ฐ’์ด๋ฉฐ ์ „์†ก ์ค‘์— ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


JWT ํ† ํฐ์˜ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ์ 

JWT ํ† ํฐ์€ ํฐ ๋ฌธ์ œ์ ์€ ํƒˆ์ทจ ๋‹นํ–ˆ์„ ๋•Œ ์„œ๋ฒ„๊ฐ€ ํƒˆ์ทจํ•œ ์‚ฌ๋žŒ์„ ์‹ ๋ขฐํ• ๋งŒํ•œ ์‚ฌ๋žŒ์ธ์ง€ ๊ตฌ๋ณ„์„ ๋ชปํ•ด์„œ ํƒˆ์ทจ์ž๊ฐ€ ์‹ ๋ขฐ ๊ฐ€๋Šฅํ•œ ์‚ฌ๋žŒ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” ๋ฌธ์ œ์ ์œผ๋กœ ์† ๊ผฝํž™๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ๋‘๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์ž์ฃผํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ฒจ์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ ์ธ ์ธก๋ฉด์—์„œ ์ข‹์ง€ ์•Š๊ณ , ๊ธฐ๊ฐ„์„ ๊ธธ๊ฒŒ ๋‘๋ฉด ๋ณด์•ˆ์ƒ ํƒˆ์ทจ ์œ„ํ—˜์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

JWT ํ† ํฐ ๊ตฌํ˜„ ์„ค๊ณ„ ์‹œ๋‚˜๋ฆฌ์˜ค

๊ทธ๋ž˜์„œ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Access Token๊ณผ Refresh Token๋กœ JWT ํ† ํฐ์„ 2๊ฐœ๋กœ ๋‘ก๋‹ˆ๋‹ค.

๋ณดํ†ต Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์€ ์งง๊ฒŒ, Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์€ ๊ธธ๊ฒŒ ์„ค์ •ํ•ด์ฃผ์–ด์„œ ํ‰์†Œ์— API ํ†ต์‹ ํ•  ๋•Œ๋Š” Access Token์„ ์‚ฌ์šฉํ•˜๊ณ , Refresh Token์€ Access Token์ด ๋งŒ๋ฃŒ๋˜์–ด ๊ฐฑ์‹ ๋  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ์•ก์„ธ์Šค ํ† ํฐ์€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ , ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋Š” ์ด์œ ๋Š” ์•ก์„ธ์Šค๋Š” ์งง๊ฒŒ, ๋ฆฌํ”„๋ ˆ์‹œ๋Š” ๊ธธ๊ฒŒ ์ €์žฅํ•˜์—ฌ ๋ณด์•ˆ ํšจ์œจ์„ ์˜ฌ๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.(๋˜ํ•œ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฟ ํ‚ค์— ์ €์žฅํ•˜๋Š”๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋ณด์•ˆ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ  http-only๋ฅผ ๋ฆฌํ”„๋ ˆ์‹œ์— ๊ฑธ์–ด์ฃผ๋ฉด http ํ†ต์‹ ์„ ์‹œ๋„ํ•  ๋•Œ ์„œ๋ฒ„์— ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ „์†กํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ์ƒ์—์„œ js ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์ด๋•Œ ์•ก์„ธ์Šค ํ† ํฐ์€ APIํ˜ธ์ถœ์ด๋‚˜ ์ƒˆ๊ณ ๊ณ ์นจ, ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ํ† ํฐ ๋งŒ๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์„œ ์œ ํšจํ•˜๋‹ค๋ฉด ์‹คํ–‰๋˜๋„๋กํ•˜๊ณ  ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.


๊ตฌํ˜„ ๊ฐ„์— JWT ํ† ํฐ ์ž˜๋ชป๋œ ์ดํ•ด์™€ ์‚ฌ์šฉ

๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์œ ํšจํ•˜๋‹ค๋ฉด ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•ด์ฃผ๋Š” ์—ญํ• ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ ์ •ํ•ด๋‘” ์‹œ๊ฐ„์ด ๋‹ค๋˜๋ฉด ์ฟ ํ‚ค์—์„œ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฑธ ๊ฐ€์ง€๊ณ  ๋กœ๊ทธ์•„์›ƒ ์‹œ์ผฐ๋‹ค.

์ด๋•Œ ์ด๋ ‡๊ฒŒ ์ดํ•ดํ•œ ์ด์œ ๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ ๋ชปํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํ”„๋ ˆ์‹œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜๋ผ๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๊ณ  ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋กœ๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ฟ ํ‚ค์— ์ €์žฅํ–ˆ์„ ๋•Œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์ฟ ํ‚ค์—์„œ ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„! ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์„œ ์ฟ ํ‚ค์—์„œ ์‚ญ์ œ๋˜๋ฉด ์ž๋™ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜! ์ด๋ ‡๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์€ ์˜ค๋กœ์ง€ ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ ํ•ด์ฃผ๋Š” ์šฉ๋„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

๋˜ํ•œ ์ฟ ํ‚ค์— ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์œผ๋กœ
1. ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ฟ ํ‚ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ํฌ๋กฌ ๋ณด์•ˆ ์ •์ฑ… ๋•Œ๋ฌธ์— ์ „์†ก์ด ์•ˆ๋œ๋‹ค.
2. Cross Site Scripting(XSS) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์„œ๋ฒ„์—์„œ๋Š” ์ฟ ํ‚ค์— js๋กœ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” http-only๋ฅผ ๊ฑธ์–ด์ค˜์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ http ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„œ๋ฒ„๋กœ ์ฟ ํ‚ค ๊ฐ’์„ ์ „๋‹ฌํ•˜๋„๋กํ•˜์—ฌ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์ฟ ํ‚ค ๊ฐ’์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜ํ•œ XSS ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์ด๋กœ์จ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ฟ ํ‚ค์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๋” ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ๊ตฌํ˜„ํ•˜๋ฉด ์•ˆ๋˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ ํ•œ๊ณ„ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋ฅผ ์œ ์ง€ํ•˜์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ๋“ค์€ ๋ฐœ์ƒ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • SameStie = None, secure = true๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ https ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ https ํ™˜๊ฒฝ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜์•ผํ•˜์ง€๋งŒ ๋กœ์ปฌ ํ™˜๊ฒฝ์˜ ๊ธฐ๋ณธ๊ฐ’์€ http์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ƒ์—์„œ ๋ณด๊ด€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ๋ผ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒ(๊ทธ๋ž˜์„œ ๋„๋ฉ”์ธ ๊ตฌ๋งคํ•˜์—ฌ ๋ฐฐํฌ ๊ณผ์ •์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฌธ์ œ ํ•ด๊ฒฐ)

  • ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์•„ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ

  • ํ•ด๋‹น ์—๋Ÿฌ๋Š” ์œ„์˜ ์—๋Ÿฌ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐํฌ๋ฅผ ํ•˜์—ฌ ๋ฐฐํฌ ๋„๋ฉ”์ธ๊ณผ ์„œ๋ฒ„ ๋„๋ฉ”์ธ์„ ์ผ์น˜์‹œ์ผœ์„œ ๋ฐœ์ƒํ•œ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ์˜ ์—๋Ÿฌ

SameSite๋ฅผ ์„ค์ •ํ•˜๋Š” ์ด์œ 

CSRF ๊ณต๊ฒฉ
Cross Site Request Forgery (์ดํ•˜ CSRF) ๊ณต๊ฒฉ์€ ์›น์‚ฌ์ดํŠธ ์ƒ์—์„œ์˜ ์š”์ฒญ์„ ์œ„์กฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ๋ง‰๋Š” ์˜ต์…˜์œผ๋กœ SameSite๋ผ๋Š” ์˜ต์…˜์ด ์ด 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

Lax : ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ์„ ํ—ˆ์šฉ ํ•˜์ง€๋งŒ get ์š”์ฒญ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋Š” ๋””ํดํŠธ ๊ฐ’์ž…๋‹ˆ๋‹ค.(post๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ) - ๊ธฐ๋ณธ๊ฐ’
(๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ์š”์ฒญํ•  ๋•Œ ์ฟ ํ‚ค๊ฐ€ ์ž๋™ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
None : ๋„๋ฉ”์ธ ๊ฒ€์ฆ X ์–ด๋””์„œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  secure = ture ํ•„์ˆ˜(ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ https ํ•„์š”)
Strict : ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ

๊ฒฐ๋ก 

์•ก์„ธ์Šค ํ† ํฐ์„ ๊ธฐ์ค€์œผ๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์„œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ 1๋ถ„ ์ „์— ์žฌ๋ฐœ๊ธ‰์„ ๋ฐ›๊ณ  ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ ๋ชป ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ์•„์›ƒ์ด ๋˜๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ• ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ... ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ api๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ ์•ก์„ธ์Šค ํ† ํฐ์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ๋‚จ์•„ ์žˆ๋‹ค๋ฉด ํ† ํฐ ์ค‘๋ณต๊ณผ ๋ณด์•ˆ์ƒ์— ์ด์œ ๋กœ ์„œ๋ฒ„์—์„œ ๋ง‰์•„๋†จ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฐœ๊ธ‰์ด ์•ˆ๋˜๊ณ  401์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŒ๋ฃŒ๊ฐ€ ๋œ ํ›„ ์žฌ๋ฐœ๊ธ‰ api๋ฅผ ํ˜ธ์ถœํ• ๋ ค๊ณ  ํ•˜๋‹ˆ ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๋กœ์ง ๋•Œ๋ฌธ์— ๋กœ๊ทธ์•„์›ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

๊ฒฐ๊ตญ ๋Œ๊ณ  ๋Œ์•„์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์œผ๋กœ ํ•ด์ค˜์•ผ ๊น”๋”ํ•œ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค..(http-only๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด js๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•ด์„œ ์ฟ ํ‚ค์—์„œ ์‚ฌ๋ผ์ง€๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ์ด๋Š” sameSite=none, secure=false ์„ค์ •์œผ๋กœ ์ธํ•ด ์ฟ ํ‚ค ์ฐจ๋‹จ์ด ๋ฐœ์ƒํ•ด์„œ ์ฟ ํ‚ค์—์„œ ์‚ฌ๋ผ์ง€๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ hyyp-only๋ฅผ ์‚ฌ์šฉํ•œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์œผ๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ชปํ•˜๋Š” ์ค„๋กœ ์ฐฉ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค...)

๊ฒฐ๊ตญ ๋งŽ์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์–ด์„œ ํ•ด๊ฒฐํ–ˆ์„ ๋•Œ ๊นจ๋‹ฌ์€ ์ ์œผ๋กœ๋Š” ์ผ๋‹จ ์ด๋ก ์ƒ์œผ๋กœ ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰์„ api๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ๋งˆ๋‹ค ๋งŒ๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ›„ ๋งŒ๋ฃŒ๊ฐ€ ์•ˆ๋˜์—ˆ๋‹ค๋ฉด ํ˜ธ์ถœํ•œ api ์ˆ˜ํ–‰ or ๋งŒ๋ฃŒ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ์žฌ๋ฐœ๊ธ‰ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๋Š” ์‹์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•œ๋‹ค๋ฉด ๊ธฐ์กด์— ์žˆ๋˜ ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๊ณ  api๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง€๋Š” ์‚ฌ์ด ์‹œ๊ฐ„์ด ๋ถ• ๋– ์„œ ๋กœ๊ทธ์•„์›ƒ์ด ๋ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•ก์„ธ์Šค ํ† ํฐ ๋งŒ๋ฃŒ์‹œ๊ฐ„๊ณผ ํ˜„์žฌ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด์„œ ๋งŒ๋ฃŒ๊ฐ€ ๋˜๋ฉด ์ฆ‰์‹œ ์•ก์„ธ์Šค ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด๋ณด๋‹ˆ ์ƒ๊ฐ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ์ œ๊ณตํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์™„์„ฑ ์ฝ”๋“œ

import { useEffect, useCallback } from "react";
import { useRecoilState } from "recoil";
import { userState, isLoggedInState } from "@/recoil/userState";
import { useLogout } from "@/hooks/useLogout";
import { basicAxios } from "@/api/axios";
import axios from "axios";

const useAuth = () => {
  const [user] = useRecoilState(userState);
  const [isLoggedIn] = useRecoilState(isLoggedInState);
  const { logout } = useLogout();

  const refreshAccessToken = useCallback(async () => {
    try {
      console.log("Starting token refresh...");
      const response = await basicAxios.post("/users/refresh");
      console.log("Refresh response:", response);

      const { accessToken } = response.data.result;
      const { value, expiration } = accessToken;

      console.log("Access Token: ", { value, expiration });
      localStorage.setItem("AccessToken", value);
      localStorage.setItem(
        "AccessTokenExpiration",
        new Date(expiration).getTime().toString()
      );

      return value;
    } catch (error) {
      console.error("์•ก์„ธ์Šค ํ† ํฐ ๊ฐฑ์‹  ์‹คํŒจ:", error);

      if (axios.isAxiosError(error)) {
        const response = error.response;
        console.log("Axios ์˜ค๋ฅ˜ ์‘๋‹ต:", response);

        if (response?.status === 401) {
          console.log("Unauthorized ์˜ค๋ฅ˜ ์‘๋‹ต:", response.data);
        }
      }

      return null;
    }
  }, []);

  const checkAndRefreshToken = useCallback(async () => {
    const accessToken = localStorage.getItem("AccessToken");
    const accessTokenExpiration = localStorage.getItem("AccessTokenExpiration");

    if (accessToken && accessTokenExpiration) {
      const now = new Date().getTime();
      const expirationTime = Number(accessTokenExpiration);

      if (now >= expirationTime) {
        // ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ๊ณ ์นจํ•˜์„ธ์š”.
        const newAccessToken = await refreshAccessToken();
        if (newAccessToken) {
          // ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ ๋ฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์œผ๋กœ localStorage ์—…๋ฐ์ดํŠธ
          localStorage.setItem("AccessToken", newAccessToken);
          // axios ์ธ์Šคํ„ด์Šค๊ฐ€ Authorization ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ—ค๋” ์—…๋ฐ์ดํŠธ -> ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ ํ—ค๋”์— ์ €์žฅ
          basicAxios.defaults.headers.common[
            "Authorization"
          ] = `Bearer ${newAccessToken}`;
        } else {
          // ํ† ํฐ ์ƒˆ๋กœ ๊ณ ์นจ ์‹คํŒจ ์ฒ˜๋ฆฌ, ์‚ฌ์šฉ์ž ๋กœ๊ทธ์•„์›ƒ ๊ฐ€๋Šฅ
          logout(); // ์ด ๋ถ€๋ถ„์—์„œ ํ† ํฐ ๊ฐฑ์‹  ์‹คํŒจ ์‹œ ๋กœ๊ทธ์•„์›ƒ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค
        }
      } else {
        // ์•ก์„ธ์Šค ํ† ํฐ์€ ์—ฌ์ „ํžˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ axios ํ—ค๋”๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.
        basicAxios.defaults.headers.common[
          "Authorization"
        ] = `Bearer ${accessToken}`;
      }
    } else {
      // ์•ก์„ธ์Šค ํ† ํฐ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      logout();
    }
  }, [refreshAccessToken, logout]);

  useEffect(() => {
    checkAndRefreshToken();
  }, [checkAndRefreshToken]);

  return { user, isLoggedIn, checkAndRefreshToken };
};

export default useAuth;

ํ˜„์žฌ ๋กœ์ง์€ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ 15๋ถ„์•ˆ์— 5๋ถ„ ์งœ๋ฆฌ ์•ก์„ธ์Šค ํ† ํฐ 3๋ฒˆ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๊ณ  4๋ฒˆ ์งธ ์•ก์„ธ์Šค ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ api ์š”์ฒญํ•  ๋•Œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋กœ์ปฌ์—์„œ ์•ก์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด์„œ ๋กœ๊ทธ์•„์›ƒ์ด ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

JWT ํ† ํฐ ๊ตฌํ˜„ ๊ฐ„์— ๊ณ ๋ คํ•œ ๋ณด์•ˆ ๋ฌธ์ œ๋“ค

์ œ์ผ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•
: Refresh Token์€ http only, secure Cookie์— ์ €์žฅ & Access Token์€ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ์ €์žฅ

=> CSRF ๊ณต๊ฒฉ : Cookie์— Access Token์ด ์—†๊ธฐ์— ์ธ์ฆ ๋ถˆ๊ฐ€ ์ƒํƒœ. http only secure ์ฟ ํ‚ค ํŠน์„ฑ์ƒ refresh token ์ž์ฒด๋ฅผ ํ„ธ ๋ฐฉ๋ฒ•์ด ์—†์Œ

=> XSS ๊ณต๊ฒฉ : Access Token์€ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ์— ํƒˆ์ทจ ๋ถˆ๊ฐ€

=> Access Token์„ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ์งง๊ฒŒ ๊ฐ€์ ธ๊ฐ์œผ๋กœ์จ ๊ทธ๋‚˜๋งˆ ์ทจ์•ฝํ•œ XSS๋ฅผ ์ข€ ๋” ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Œ

๋งˆ๋ฌด๋ฆฌ

์ถ”๊ฐ€์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ฐ„์— ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ ์‚ฌ์ด์˜ ์ฟ ํ‚ค ์ „์†ก ๋ฌธ์ œ๋“ค์„ ๋‹ค๋ค„๋ณผ๋ ค๊ณ  ํ•œ๋‹ค.

JWT ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ์ฟ ํ‚ค ์ „์†ก ๊ณผ์ •์—์„œ ๊ฒช์€ ์ด์Šˆ

๋ฌธ์ œ ๋ฐœ์ƒ 1

SameSite ๊ธฐ๋ณธ ์†์„ฑ ๊ฐ’์€ Lax์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋™์ผ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋„๋ก ์ œํ•œํ•˜์—ฌ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก ํŠธ๋กœ ์ฟ ํ‚ค ์ „์†ก ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ”„๋ก ํŠธ ์„œ๋ฒ„์™€ API ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ๋„๋ฉ”์ธ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฌธ์ œ ๋ฐœ์ƒ 2

ํ•˜์ง€๋งŒ SameSite=None์ผ ๊ฒฝ์šฐ Secure ์†์„ฑ์„ true๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

์ด ์„ค์ •์€ ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ HTTPS ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด์„œ๋งŒ ์ „์†ก๋˜๋„๋ก ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ HTTP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ๊ฒฐ์—์„œ๋Š” ์ด ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ฌธ์ œ ๋ฐœ์ƒ 3

SameSite=None, Secure; ์„ค์ •์„ ์œ„ํ•ด ๊ฐ€๋น„์•„์—์„œ ๋„๋ฉ”์ธ์„ ๊ตฌ๋งคํ•˜๊ณ  SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜์—ฌ HTTPS ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ API๋ฅผ ํ†ตํ•ด ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„์˜ค๋ฉด ๊ฑฐ๋ถ€๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

"refresh_token" ์ฟ ํ‚ค๋Š” ์™ธ๋ถ€ ์ฟ ํ‚ค์ด๊ณ  "Partitioned" ์†์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณง ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.

SameSite=None; Secureย ์„ค์ •์„ย ๊ฐ€์ง„ย ์ฟ ํ‚ค๋“ค์ดย ํฌ๋กœ์Šคย ์‚ฌ์ดํŠธ(๋‹ค๋ฅธย ๋„๋ฉ”์ธย ๊ฐ„)ย ์ปจํ…์ŠคํŠธ์—์„œย ์ž‘๋™ํ•˜๋Š”ย ๊ฒฝ์šฐ,ย ์ด๋“ค์„ย ์จ๋“œํŒŒํ‹ฐย ์ฟ ํ‚ค๋กœย ์ทจ๊ธ‰ํ•˜๊ณ ,ย ํฌ๋กฌ์—์„œย ์ด๋Ÿฌํ•œย ์ฟ ํ‚ค์˜ย ์‚ฌ์šฉ์„ย ์ฐจ๋‹จํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด๋Š”ย ์‚ฌ์šฉ์ž์˜ย ๊ฐœ์ธ์ •๋ณดย ๋ณดํ˜ธ๋ฅผย ๊ฐ•ํ™”ํ•˜๊ณ ,ย ํฌ๋กœ์Šคย ์‚ฌ์ดํŠธย ์ถ”์ ์„ย ๋ฐฉ์ง€ํ•˜๊ธฐย ์œ„ํ•œย ์กฐ์น˜๋ผ๊ณ  ํ•œ๋‹ค.

ํ”„๋ก ํŠธ ์—”๋“œ ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋Š” www.fordogs.store์ด๊ณ  ๋ฐฑ์—”๋“œ API ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋Š” api.fordogs.store ์ด๋‹ค. ๊ฐ™์€ ๋„๋ฉ”์ธ์ž„์—๋„ ์™ธ๋ถ€ ์ฟ ํ‚ค๋กœ ์ทจ๊ธ‰๋˜๋Š” ์ด์œ ๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ domain ์†์„ฑ ๋ฌธ์ œ์˜€๋‹ค.

domainย ์†์„ฑ์— ์•„๋ฌด ๊ฐ’๋„ ๋„ฃ์ง€ ์•Š์•˜๋‹ค๋ฉด, ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•œ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ธŒ ๋„๋ฉ”์ธ์—์„œ๋„ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๋•Œ๋ฌธ์— domainย ์†์„ฑ์— ๋ฃจํŠธ ๋„๋ฉ”์ธ์ธย domain=fordogs.store๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.

์ถ”๊ฐ€๋กœ ๊ฐ™์€ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด SameSite=None๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— SameSite=Strict๋กœ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.

ํ•œ ์ค„ ์š”์•ฝ

JWT ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ XSS ๊ณต๊ฒฉ๊ณผ js ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด httpOnly ์ฟ ํ‚ค์— ๋„ฃ์–ด์„œ ์ „๋‹ฌ์„ ๋ฐ›์•˜๋Š”๋ฐ, same-site ๊ธฐ๋ณธ๊ฐ’์ด Lax๋กœ ์„ค์ • ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผ ๋„๋ฉ”์ธ์ด ์•„๋‹Œ ๋กœ์ปฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ณผ ์„œ๋ฒ„ ๊ฐ„์˜ ์ฟ ํ‚ค ์ „๋‹ฌ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด same-site๋ฅผ none์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ์š”์ฒญํ•˜์˜€๊ณ  ์ด ๊ณผ์ •์—์„œ ๋ฐฑ์—”๋“œ ์ธก์€ secure : true ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ–ˆ๋Š”๋ฐ secure : ture๋Š” https ํ”„๋กœํ† ์ฝœ์—์„œ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” SSL ์ธ์ฆ์„œ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ SSL ์ธ์ฆ์„œ๋Š” ํŠน์ • ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ์„ ๊ตฌ์ž…ํ•˜์—ฌ ์„œ๋ฒ„์—์„œ SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›์€ ํ›„ https ๋ฅผ ์ ์šฉํ•˜์˜€๊ณ  ํ”„๋ก ํŠธ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋„ https ์™€ ์†ก์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด https ์„ค์ •์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ Partitioned ์ฟ ํ‚ค๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์„œ๋ฒ„์™€ ํ”„๋ก ํŠธ์˜ ๋„๋ฉ”์ธ์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”๊ณ  SameSite=Strict๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

profile
์ฐจ๊ณก์ฐจ๊ณก ๊ทธ๋งŒ ์Œ“์•„์˜ฌ๋ฆฌ๊ณ  ์ทจ์—…ํ•ด์„œ ๋ถ€๋”ช์ณ๋ณด๊ณ  ์‹ถ์€

0๊ฐœ์˜ ๋Œ“๊ธ€