[๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌCS ์Šคํ„ฐ๋”” 2์ฃผ์ฐจ] - ๋„คํŠธ์›Œํฌ ์ฟ ํ‚ค & ์„ธ์…˜ & ํ† ํฐ

๊น€์œค์ค€ยท2023๋…„ 12์›” 20์ผ

CS ์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
10/13

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

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

์ฟ ํ‚ค(Cookie)

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

ํŠน์ง•

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž์˜ PC์— ์ €์žฅ๋จ.
  • ๊ฐ ์ฟ ํ‚ค๋Š” ๋„๋ฉ”์ธ๋ณ„๋กœ ์ €์žฅ๋˜๋ฉฐ, ๊ฐ ์ฟ ํ‚ค์˜ ํฌ๊ธฐ๊ณผ ํšŸ์ˆ˜๋Š” ์ œํ•œ์ด ์žˆ๋‹ค.
  • ๋งŒ๋ฃŒ ๋‚ ์งœ/์‹œ๊ฐ„์ด ์ง€์ •๋˜์–ด ์žˆ์–ด, ๊ทธ ์‹œ์ ์ด ์ง€๋‚˜๋ฉด ์ฟ ํ‚ค๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค.

์ฟ ํ‚ค์˜ ๋™์ž‘ ์ˆœ์„œ.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  2. ์›น ์„œ๋ฒ„๋Š” ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. ์ƒ์„ฑํ•œ ์ฟ ํ‚ค์— ์ •๋ณด๋ฅผ ๋‹ด์•„ HTTP ํ™”๋ฉด์„ ๋Œ๋ ค์ค„ ๋•Œ, ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋Œ๋ ค์ค€๋‹ค.
  4. ๋„˜๊ฒจ๋ฐ›์€ ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค(๋กœ์ปฌ PC) ๋‹ค์‹œ ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•œ๋‹ค.
  5. ๋™์ผ ์‚ฌ์ดํŠธ ์žฌ๋ฐฉ๋ฌธ ์‹œ ํด๋ผ์ด์–ธํŠธ PC์•  ํ•ด๋‹น ์ฟ ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์š”์ฒญ ํŽ˜์ด์ง€์™€ ํ•จ๊ป˜ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•œ๋‹ค.

์„ธ์…˜(Session)

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

ํŠน์ง•

  • ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์— ์ €์žฅ๋œ๋‹ค.
  • ์„ธ์…˜์€ ์„œ๋ฒ„ ์ž์›์„ ํ™œ์šฉํ•˜๊ธฐ ๋–„๋ฌธ์— ๋™์‹œ์— ๋งŽ์€ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์„œ๋ฒ„์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์„ธ์…˜์€ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์ฟ ํ‚ค๋ณด๋‹ค ์šฐ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์ง์ ‘์ ์œผ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ์ผ์ • ์‹œ๊ฐ„๋™์•ˆ ํ™œ๋™์ด ์—†์„ ๊ฒฝ์šฐ ์„ธ์…˜์€ ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.

์„ธ์…˜์˜ ๋™์ž‘ ์ˆœ์„œ

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค.
  2. ์„œ๋ฒ„๋Š” ์ ‘๊ทผํ•œ ํด๋ผ์ด์–ธํŠธ์˜ Request-Header ํ•„๋“œ์ธ Cookie๋ฅผ ํ™•์ธํ•˜์—ฌ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น session-id๋ฅผ ๋ณด๋ƒˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. session-id๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์„œ๋ฒ„๋Š” session-id๋ฅผ ์ƒ์„ฑํ•ด ํด๋ผ์ด์–ธํŠธ์— ๋Œ๋ ค์ค€๋‹ค.
  4. ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋Œ๋ ค์ค€ session-id๋ฅผ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„์— ์ €์žฅํ•œ๋‹ค
  5. ํด๋ผ์ด์–ธํŠธ๋Š” ์žฌ์ ‘์†์‹œ, ์ด ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด session-id๊ฐ’์„ ์„œ๋ฒ„์— ์ „๋‹ฌํ•œ๋‹ค.

ํ† ํฐ(Token)

์‚ฌ์šฉ์ž์˜ ์ธ์ฆ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜ ์ค‘ ํ•˜๋‚˜.

์„ธ์…˜ ๊ฐ™์€ ๊ฒฝ์šฐ ๋‹ค์ˆ˜ ๋™์‹œ ์ ‘์† ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊บผ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿด ๊ฒฝ์šฐ, ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ์ด ํŠ•๊ธธ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด HDD๋‚˜ DB๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์†๋„๊ฐ€ ๋А๋ฆฌ๊ฒŒ ๋œ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๋ ˆ๋””์Šค์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌํ˜• DB ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๋ถ€๋‹ด์„ ์—†์ด ๊ณ ์•ˆ๋œ ๊ฒƒ์ด ๋ฐ”๋กœ ํ† ํฐ ๋ฐฉ์‹์ด๋‹ค.

ํ† ํฐ ์ธ๊ฐ€ ๋ฐฉ์‹

ํ† ํฐ ์ธ๊ฐ€ ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์ด๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ† ํฐ(Token)์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค.
์ด ํ† ํฐ์€ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ์ด ํ† ํฐ์„ ๋ณด๋‚ด์–ด ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

ํ† ํฐ ๋ฐฉ์‹ ์ค‘ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด JWT์ด๋‹ค.

JWT(Json Web Token)

Json์œผ๋กœ ๋œ ์›น ํ† ํฐ์ด๋ผ๋Š” ๋œป.

์ฃผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ๊ณผ ์ •๋ณด ๊ตํ™˜์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์›น ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ „์†ก๋œ๋‹ค.

JWT๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

1. ํ—ค๋”(Header)

ํ•ด๋”๋Š” ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.
ํ† ํฐ ํƒ€์ž… typ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” JWT ๊ฐ’๊ณผ, ์„œ๋ช…์„ ํ•ด์‹ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ alg๋ฅผ ๋ช…์‹œํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, HMAC SHA-256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ JSON ๊ฐ์ฒด๋กœ ํ‘œํ˜„.

{
  "alg" : "HS256"
  "type" : "JWT" 
}

2. ํŽ˜์ด๋กœ๋“œ(Payload)

ํŽ˜์ด๋กœ๋“œ๋Š” ํด๋ ˆ์ž„์ด๋ผ๊ณ  ํ•˜๋Š” ์ผ๋ จ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ.
ํด๋ ˆ์ž„์€ ์„ธ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋‰จ ๋“ฑ๋ก๋œ, ๊ณต๊ฐœ, ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„.

ํด๋ ˆ์ž„์˜ ๋ฐ์ดํ„ฐ๋Š” ํ† ํฐ์„ ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ์—๊ฒŒ ๋ฐœ๊ธ‰ํ–ˆ๋Š”์ง€, ์œ ํšจ์‹œ๊ฐ„, ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ณต๊ฐœํ•˜๊ธฐ ์›ํ•˜๋Š” ๋‚ด์šฉ(๋‹‰๋„ค์ž„, ์„œ๋น„์Šค ์ƒ ๋ ˆ๋ฒจ, ๊ด€๋ฆฌ์ž ์—ฌ๋ถ€) ๋“ฑ์˜ ์ •๋ณด๋“ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ํฌํ•จํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ๋Š”

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "iat": 1516239022
}

3. ์„œ๋ช…

์„œ๋ช…์€ ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ธ์ฆ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ๋‹ค.

ํ—ค๋”์˜ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๊ณผ ํŽ˜์ด๋กœ๋“œ์˜ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ํ•ฉ์น˜๊ณ , ์ œ๊ณต๋œ ๋น„๋ฐ€ํ‚ค๋ฅผ ํ†ตํ•ด alg ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹ฑํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, HS256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

JWT ์ตœ์ข… ํ˜•ํƒœ๋Š” ์œ„ ์„ธ ๋ถ€๋ถ„์„ ์ (.)์œผ๋กœ ์—ฐ๊ฒฐํ•œ ๋ฌธ์ž์—ด์ด๋‹ค

Base64Url(header).Base64Url(payload).Base64Url(signature)

์ •๋ฆฌ

์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์‹ค์–ด๋ณด๋‚ธ ํ† ํฐ์˜ 1๋ฒˆ ํ—ค๋”์™€ 2๋ฒˆ ํŽ˜์ด๋กœ๋“œ์™€ ์„œ๋ฒ„์˜ ๋น„๋ฐ€ํ‚ค๋ฅผ alg ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋„ฃ๊ณ  ๋Œ๋ฆฐ๋‹ค.
๊ทธ๊ฒƒ์ด 3๋ฒˆ ์„œ๋ช… ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋‹ค๋ฉด ์ธ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ JWT๋ฐฉ์‹์€ ์„ธ์…˜๊ณผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ์ž๋“ค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•  ํ•„์š” ์—†์ด ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์˜ ๋น„๋ฐ€ํ‚ค๋กœ ํ™•์ธ๋งŒ ํ•ด์ฃผ๋ฉด ์•ž์„  ์„ธ์…˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ JWT์˜ ๊ฒฐ์ ์€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—์„œ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ์ถ”์ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ํ•œ ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋กœ๊ทธ์ธ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ํ•  ๋•Œ ๋‹ค๋ฅธ ๊ธฐ๊ธฐ๋กœ ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด. ๊ธฐ์กด ๊ธฐ๊ธฐ์— ์ฃผ์—ˆ๋˜ ํ† ํฐ์„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๊ณ  ํ† ํฐ ๊ธฐ๋ก๊ณผ ์ถ”์ ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

๋˜ํ•œ ํ† ํฐ์ด ํƒˆ์ทจ๋‹นํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ํ† ํฐ์„ ๋ฌดํšจํ™” ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋Ÿผ JWT๋Š” ๋ชป ์“ฐ๋Š”๊ฑด๊ฐ€?

์ด๋ฅผ ๋ณด์™„ํ•œ ๋ฐฉ๋ฒ•์ด access & refresh ํ† ํฐ ๋ฐฉ์‹.
ํ† ํฐ์„ ๋‘ ๊ฐœ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ช‡ ๋ถ„์ดํ•˜ ์งง์€ access ํ† ํฐ๊ณผ 2์ฃผ ์ •๋„๋กœ ๊ธด refresh ํ† ํฐ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

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