Cookie,Session๊ณผ JWT

@choi2021 ยท December 09, 2022 ยท 16 min read

๐Ÿ” Cookie,Session, JWT

๋ชจ์œผ์žก์˜ Next-auth๋ฅผ ๊ณ ๋ คํ•˜๋ฉด์„œ Cookie,Session, JWT์— ๋Œ€ํ•ด ๋‹ค์‹œ ์ •๋ฆฌํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๊ณผ์ •๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ๋ณด์•ˆ์„ ์–ด๋–ป๊ฒŒ ๊ณ ๋ คํ•ด์„œ ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

์ธ์ฆ๊ณผ ์ธ๊ฐ€๋ž€

์ธ์ฆ๊ณผ ์ธ๊ฐ€, ๋‹จ์–ด ๋งŒ์œผ๋กœ๋Š” ๊ตฌ๋ถ„์ด ์ž˜ ์•ˆ ๊ฐ€์„œ ๋จผ์ € ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค. ์ธ์ฆ์€ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์‹ ์›์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๊ณ , ์ธ๊ฐ€๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋“ค์–ด๊ฐ€ ๊ธ€์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ •ํ•˜๊ณ  ๋งŒ๋“  ํšŒ์›์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์„œ๋น„์Šค ์ด์šฉ์ž๋ผ๋Š” ๊ถŒํ•œ์„ ์–ป๊ณ  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ, ๋ฐ”๋กœ ์ธ์ฆ๊ณผ์ •์ด๋‹ค. ๋กœ๊ทธ์ธ ํ›„์— ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ธ€์„ ์ง€์šฐ๊ณ  ์‹ถ์–ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์“ฐ์ง€ ์•Š์€ ๊ธ€์€ ์ง€์šธ ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ธ€์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ ์ธ๊ฐ€๊ณผ์ •์ด๋‹ค.

์ด๋Ÿฌํ•œ ์ธ์ฆ, ์ธ๊ฐ€๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ๋ฐฉ์‹์œผ๋กœ "cookie์™€ session์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•"๊ณผ "JWT๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•"์ด ์žˆ๋‹ค. ๋จผ์ € ๊ฐ๊ฐ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

Cookie์™€ Session

๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์ „์— ์ด์ „์— ์ •๋ฆฌํ–ˆ๋˜ HTTP์˜ ํŠน์ง• ์ค‘ stateless๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. stateless๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์‚ฌ์ด์˜ http ํ†ต์‹ ๋“ค๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์ด ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋จผ์ € ์–ด๋– ํ•œ ํ†ต์‹ ์„ ๋ณด๋‚ด์•ผ ๋‹ค์Œ ํ†ต์‹ ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•ญ์ƒ ๋…๋ฆฝ์ ์ธ ํ†ต์‹ ์„ ์œ ์ง€ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ์ธ์ฆํ–ˆ๋Š”์ง€๋ฅผ http ํ†ต์‹  ์ž์ฒด๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

Cookie

์ฟ ํ‚ค๋Š” ์›น์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธ ์‹œ์— ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €์— ์„ค์น˜๋˜๋Š” key์™€ value ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์˜๋ฏธํ•œ๋‹ค. HTTP๋กœ ํ•ด๋‹น ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„๋Š” ์ธ์ฆ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์— ๋‹ด์•„ ์‘๋‹ต์„ ๋ณด๋‚ด์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ๋ฐ›์€ ์ฟ ํ‚ค๋Š” ๋ธŒ๋ผ์šฐ์ €์— ์ž๋™์œผ๋กœ ์ €์žฅ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋„ฃ์–ด์„œ ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ์•Š์•„๋„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ request header์— ๋„ฃ์–ด์„œ ์„œ๋ฒ„์— ์ „๋‹ฌํ•œ๋‹ค. ์ธ์ฆ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š์•„๋„ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค.

cookie
cookie

์ด๋ ‡๊ฒŒ ์ฟ ํ‚ค๋Š” HTTP์˜ stateless ํŠน์„ฑ์„ ์ง€ํ‚ค๋ฉด์„œ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธ์ฆ ์ •๋ณด๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜์–ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋ณด๊ด€ ์‹œ ๋ณด์•ˆ์— ์œ„ํ—˜ํ•œ ๋‹จ์ ์„ ๊ฐ€์ง„๋‹ค. ์ด์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด session์ด๋‹ค.

Session

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

์ด๋ ‡๊ฒŒ ์„ธ์…˜์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋กœ login์„ ํ–ˆ์„ ๋•Œ, ๋ณ„๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ request Header์— ์ „๋‹ฌ ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ๋„ฃ์–ด์„œ ๋ณด๋‚ด๊ฒŒ ๋˜๊ณ , ์„œ๋ฒ„๋Š” ์„œ๋ฒ„์— ์ €์žฅํ•ด๋‘” ์„ธ์…˜ ์ •๋ณด์™€ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ด ์ธ์ฆ ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.

session
session

์ด๋ ‡๊ฒŒ ์„ธ์…˜์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋ฅผ ๊ทธ๋ƒฅ ๋ฐœ๊ธ‰ํ•  ๋•Œ๋ณด๋‹ค๋Š” ๋А๋ฆฌ์ง€๋งŒ, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์ž์ฒด๊ฐ€ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฉด์„œ ์„œ๋ฒ„๊ฐ€ statefulํ•ด์ง€๋Š” ๋‹จ์ ์„ ๊ฐ€์ง„๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ stateful ํ•ด์ง„ ์„œ๋ฒ„๋Š” session์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ์ง€์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

๋จผ์ € ๋งŒ์•ฝ ์„œ๋ฒ„ ๋กœ์ปฌ์— ์ €์žฅํ•œ๋‹ค๋ฉด ์„œ๋ฒ„๊ฐ€ ๊บผ์ง€๊ฒŒ ๋œ ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์ด์ „์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์žƒ์–ด ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ๋Š” ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ๊ฐ๊ฐ ์„œ๋ฒ„์— ์ €์žฅํ•œ๋‹ค๋ฉด ์„œ๋ฒ„1์—์„œ ์ธ์ฆํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„3์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ๊ฐ™์€ ์ •๋ณด์ง€๋งŒ ์ธ์ฆ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ๋‹จ์ ์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

server
server

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด session์„ ์ด์šฉํ•  ๋•Œ๋Š” Session DB๋ฅผ ๋‘์–ด ์„œ๋ฒ„์™€ ๋ถ„๋ฆฌํ•ด ๊ด€๋ฆฌํ•œ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊บผ์ ธ๋„ DB๊ฐ€ ์‚ด์•„์žˆ๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ๋‚ ๋ผ๊ฐ€์ง€ ์•Š๊ณ , ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€๊ฐ€ ๋˜์–ด๋„ ํ•œ ๊ณณ์—์„œ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

server
server
ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” statefulํ•œ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€๋กœ ๋ถ„์‚ฐํ•ด ์š”์ฒญ๋“ค์„ ์ฒ˜๋ฆฌํ•ด๋„ ์—ฌ์ „ํžˆ ์„ธ์…˜ DB๋Š” ํ•œ ๊ณณ์—์„œ ์ธ์ฆํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์˜ ๋ฌธ์ œ์ ๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฒƒ์ด JWT๋‹ค.

JWT

JWT (Json Web Token)์€ JSON ๊ฐ์ฒด ๊ตฌ์กฐ์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ secret ํ‚ค๋ฅผ ์ด์šฉํ•ด ์•”ํ˜ธํ™” ์‹œํ‚จ ํ† ํฐ์œผ๋กœ header, payload, signature ์„ธ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  • Header: ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ type
  • Payload: ์ „์†กํ•  ์ธ์ฆ ์ •๋ณด
  • Signature: Base64๋ฐฉ์‹์œผ๋กœ header, payload ์ธ์ฝ”๋”ฉํ•˜๊ณ  secret ํ‚ค๋กœ ์•”ํ˜ธํ™” ๋˜์–ด์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ, payload์˜ ๋‚ด์šฉ ๋ณ€ํ™”๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

jwt
jwt
JWT๋Š” ์ด๋ ‡๊ฒŒ ์•”ํ˜ธํ™”๊ฐ€ ๋˜์–ด์žˆ์–ด์„œ ์•ˆ์ „ํ•˜๊ตฌ๋‚˜ ์‹ถ์ง€๋งŒ, JWT ์ž์ฒด๋Š” json์ด base 64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ตฌ๋‚˜ jwt๋ฅผ ๋””์ฝ”๋”ฉํ•ด header์™€ payload์˜ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋…ธ์ถœ๋˜์–ด๋„ ํฌ๊ฒŒ ์œ„ํ—˜ํ•˜์ง€ ์•Š์€ username๊ณผ ๊ฐ™์€ ์ตœ์†Œํ•œ์˜ ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ์ธ์ฝ”๋”ฉํ•ด ๋‹ด๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ๊ฒƒ ์•„๋‹๊นŒ ์‹ถ์ง€๋งŒ, signature๋ถ€๋ถ„์€ header์™€ payload ์„œ๋ฒ„์— ๋ณด๊ด€ํ•  ๊ฐœ์ธ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ ์•”ํ˜ธํ™”๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค. ์„œ๋ฒ„๋งŒ์ด ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ธ ํ‚ค๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” JWT ํ† ํฐ์„ ์ „๋‹ฌํ•œ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ด์ฃผ๊ณ  ์ „๋‹ฌ๋ฐ›์€ ํ† ํฐ์œผ๋กœ ์ดํ›„์— ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋“ฏ์ด ์ธ์ฆ์ด ํ•„์š”ํ•œ ์š”์ฒญ์— ๋‹ด์•„์„œ ์„œ๋ฒ„์— ์š”์ฒญํ•œ๋‹ค. ์š”์ฒญ์— ๋“ค์–ด์žˆ๋Š” JWT์˜ signature๋ถ€๋ถ„์„ ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” secret์œผ๋กœ ๋ณตํ˜ธํ™”ํ•ด header์™€ payload๋ฅผ ํ™•์ธํ•ด ์ธ์ฆํ•˜๊ฒŒ ๋œ๋‹ค.

jwtflow
jwtflow

์„œ๋ฒ„๋Š” ๋” ์ด์ƒ ์ธ์ฆ์„ ์œ„ํ•ด session์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์•„๋„ ๋˜๊ณ , ๊ฐ๊ฐ์˜ ์„œ๋ฒ„์— secret ํ‚ค๋ฅผ ๋‘๊ณ  ํ™•์ธํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ ํ† ํฐ statelessํ•œ ์žฅ์ ์€ session๊ณผ ๋‹ค๋ฅธ ๋ณด์•ˆ์˜ ํ—ˆ์ ์„ ๋งŒ๋“ ๋‹ค. ํ† ํฐ์„ ๋…ธ์ถœ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•œ ์‚ฌ๋žŒ์ด ์„œ๋ฒ„์—์„œ๋Š” ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ด๋•Œ๋ฌธ์— ํ† ํฐ์„ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ์ง€์— ๋Œ€ํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์ ์„ ๊ฐ€์ง„๋‹ค.

Access Token๊ณผ Refresh Token

ํ† ํฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฃผ๋กœ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์งง์€ Access ํ† ํฐ๊ณผ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ๊ธด refresh ํ† ํฐ์„ ๋‘๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์€ access Token๋งŒ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด ์œ ์ €๋Š” ๊ณ„์†ํ•ด์„œ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจ ๊ธฐ๊ฐ„์ด ๊ธด refresh ํ† ํฐ์„ ํ•จ๊ป˜ ๋ณด๋‚ด ๋กœ๊ทธ์ธ ์œ ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๊ณผ์ •์„ ๋ณด๋ฉด ๋จผ์ € ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ํ† ํฐ์„ ๋‹ค ์ „๋‹ฌํ•œ๋‹ค.

token
token

์‚ฌ์šฉ์ž๋Š” ์ „๋‹ฌ ๋ฐ›์€ access token์œผ๋กœ ์œ ํšจ ๊ธฐ๊ฐ„ ๋™์•ˆ ์ธ์ฆ์„ ์ง„ํ–‰ํ•˜๊ณ , ์ดํ›„ ์œ ํšจ ๊ธฐ๊ฐ„์ด ๋‹ค๋˜๊ฒŒ ๋˜๋ฉด refresh ํ† ํฐ์„ ์ด์šฉํ•ด ์ƒˆ๋กญ๊ฒŒ access token์„ ๋ฐ›์•„ ์ธ์ฆ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

token
token

Access ํ† ํฐ์€ ์œ ํšจ ๊ธฐ๊ฐ„์ด ์งง์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ์‚ฌ์ด์— ํ•ดํ‚น์˜ ์œ„ํ—˜์ด ์žˆ๊ณ , Refresh Token ์œ ํšจ ๊ธฐ๊ฐ„์ด ๊ธธ๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๋ณด์•ˆ์— ์‹ ๊ฒฝ์„ ์จ์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ”„๋ก ํŠธ์—”๋“œ ์ž…์žฅ์—์„œ ์–ด๋””์— ๋ณด๊ด€ํ•˜๋ƒ๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ํ† ํฐ์€ ์–ด๋””์— ๋ณด๊ด€ํ•ด์•ผ ํ• ๊นŒ?

๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ ค๋œ ๊ฒƒ์€ ๋‚ด๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•ด์˜จ ๋ฐฉ์‹์ธ ๋ธŒ๋ผ์šฐ์ €์˜ localstorage์ด๋‹ค. local storage๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ซํ˜€๋„ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘๊ทผํ•ด request header์˜ Authorization์— ํ•ด๋‹น ํ† ํฐ์„ ๋‹ด์•„ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์˜ ํ† ํฐ์„ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ XSS (Cross-Site Scripting) ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•œ ๋‹จ์ ์„ ๊ฐ€์ง„๋‹ค.

XSS (Cross-site scripting)

XSS ๊ณต๊ฒฉ์€ ์›น์‚ฌ์ดํŠธ์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฃผ๋กœ ํŽ˜์ด์ง€์˜ input์ด๋‚˜ form์„ ์ด์šฉํ•ด ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฃผ์ž…ํ•ด๋†“์€ ์‚ฌ์ดํŠธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ์— ์‚ฌ์šฉ์ž์˜ ํ† ํฐ, ์ฟ ํ‚ค ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋นผ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

xss
xss

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

ํ•˜์ง€๋งŒ http only ์ฟ ํ‚ค๋กœ ํ† ํฐ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ CSRF ๊ณต๊ฒฉ์— ์•ฝํ•œ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

CSRF(Cross-site Request Forgery)

CSRF๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜์ง€ ์•Š์€ action์„ ํ•˜๊ฒŒํ•˜๋Š” ํ•ดํ‚น ๋ฐฉ๋ฒ•์œผ๋กœ, ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž ๋ชฐ๋ž˜ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค. http only๋กœ ๋œ ์ฟ ํ‚ค์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋นผ์˜ฌ ์ˆ˜๋Š” ์—†์ง€๋งŒ ๊ณ„์ขŒ์ด์ฒด๋‚˜ ๋ฌผ๊ฑด์„ ๊ตฌ์ž…ํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋“ฑ์˜ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— http only ์ฟ ํ‚ค๋งŒ์„ ์ด์šฉํ•ด์„œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด CSRF๊ณต๊ฒฉ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ์–ด, ์ถ”๊ฐ€์ ์ธ ๋ฐฉ์‹์ด ํ•„์š”ํ•œ๋ฐ ์ด๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด CSRF ํ† ํฐ์ด๋‹ค.

csrf
csrf

CSRF ํ† ํฐ์„ ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด ๋‘๊ณ  ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ํ•จ๊ป˜ ๋ณด๋‚ด์„œ, http only ์ฟ ํ‚ค์™€ CSRFํ† ํฐ์„ ์„œ๋ฒ„๊ฐ€ ํ™•์ธ ํ›„์— ์š”์ฒญ์ด ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

ํ† ํฐ๊ณผ์ •
ํ† ํฐ๊ณผ์ •

๋งˆ์น˜๋ฉฐ

์ธ์ฆ์ด๋ž€ ๊ณผ์ •์€ ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ๊ณผ์ •๋“ค์ด ์ˆจ์–ด์žˆ๊ณ  ๊ณ ๋ คํ•ด์•ผํ•  ์ ์ด ๋งŽ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋‚˜ ๋ฐฑ์—”๋“œ์—์„œ๋งŒ ์ž˜ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‘๊ฐ€์ง€ ์ธก๋ฉด์„ ๋ชจ๋‘ ์ƒ๊ฐํ•ด์•ผ ๋ณด์•ˆ์„ ๊ณ ๋ คํ•œ ์ธ์ฆ๋ฐฉ์‹์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

[์ฐธ๊ณ ]

@choi2021
๋งค์ผ์˜ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐœ๋ฐœ์ผ์ง€์ž…๋‹ˆ๋‹ค.