๐Ÿ—‚๏ธ ํ† ํฐ, ์„ธ์…˜, ์ฟ ํ‚ค ๋ž€?

๊น€์ˆ˜์ง„ยท2025๋…„ 5์›” 29์ผ

๐Ÿช ์ฟ ํ‚ค๋ž€?

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

๐Ÿ” ์ฟ ํ‚ค ์ž‘๋™ ๋ฐฉ์‹

1. ์ฟ ํ‚ค ๋งŒ๋“ค๊ธฐ (์„œ๋ฒ„ -> ๋ธŒ๋ผ์šฐ์ €)

์„œ๋ฒ„: ์ด ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธํ–ˆ๋„ค? ๊ทธ๋Ÿผ ๋ฉ”๋ชจ ์ ์ž!
Set-Cookie: isLoggedIn=true

๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๊ฑธ ๋ฐ›์•„์„œ ์ €์žฅํ•ด๋‘”๋‹ค.

2. ์ž๋™์œผ๋กœ ๋ณด๋‚ด๊ธฐ (๋ธŒ๋ผ์šฐ์ € โ†’ ์„œ๋ฒ„)

๋‹ค์‹œ ๊ทธ ์‚ฌ์ดํŠธ์— ๋“ค์–ด๊ฐ€๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€

Cookie: isLoggedIn=true

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ธ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๋Š”
"์˜ค! ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ๋„ค~"
ํ•˜๊ณ  ๋ฐ”๋กœ ์„œ๋น„์Šค๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ฟ ํ‚ค ๋‹จ์ 

๋ˆ„๊ตฌ๋‚˜ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ผ ๋ณด์•ˆ์— ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.
-> ์ค‘์š”ํ•œ ์ฟ ํ‚ค์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ชป ๋ณด๊ฒŒ ์ž ๊ทธ๋Š” HttpOnly ์˜ต์…˜์„ ๋ถ™์ธ๋‹ค.
-> https์—์„œ๋งŒ ์“ฐ๊ฒŒ ํ•˜๋Š” Secure ์˜ต์…˜์„ ์“ฐ๊ธฐ๋„ ํ•œ๋‹ค.

๐ŸŽŸ๏ธ ์„ธ์…˜์ด๋ž€?

์„ธ์…˜์€ ํด๋ผ์ด์–ธํŠธ(์‚ฌ์šฉ์ž)์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ผ์ • ์‹œ๊ฐ„ ๋™์•ˆ ์œ ์ง€ํ•˜๋ฉฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž๋ณ„ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

๐Ÿ” ์„ธ์…˜ ์ž‘๋™ ๋ฐฉ์‹

1. ์„ธ์…˜ ์ƒ์„ฑ

์‚ฌ์šฉ์ž: ์ € ๋กœ๊ทธ์ธํ• ๊ฒŒ์š”! (์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ „์†ก)

์„œ๋ฒ„๋Š” ์ •๋ณด๋ฅผ ํ™•์ธํ•œ ๋’ค:

์„œ๋ฒ„: ๋กœ๊ทธ์ธ ์„ฑ๊ณต! ์ด ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์–ตํ•ด์•ผ์ง€.
(์„œ๋ฒ„ ์•ˆ์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ์„ธ์…˜ ID๋ฅผ ๋งŒ๋“ ๋‹ค)

Set-Cookie: sessionId=abc123; HttpOnly

๋ธŒ๋ผ์šฐ์ €๋Š” sessionId๋ฅผ ์ฟ ํ‚ค๋กœ ์ €์žฅํ•œ๋‹ค.

2. ๋‹ค์Œ ์š”์ฒญ์— ์ž๋™์œผ๋กœ ์„ธ์…˜ ID ํฌํ•จ (๋ธŒ๋ผ์šฐ์ € โ†’ ์„œ๋ฒ„)

์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจํ•  ๋•Œ:

Cookie: sessionId=abc123

์ด๋ ‡๊ฒŒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„ธ์…˜ ID๋ฅผ ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค.

3. ์„œ๋ฒ„๋Š” ์„ธ์…˜ ID๋กœ ์‚ฌ์šฉ์ž ์‹๋ณ„

์„œ๋ฒ„๋Š” ์„ธ์…˜ ID abc123์„ ํ™•์ธํ•˜๊ณ ,

์„œ๋ฒ„: ์•„, ์ด๊ฑด ์•„๊นŒ ๋กœ๊ทธ์ธํ–ˆ๋˜ ์‚ฌ์šฉ์ž๊ตฌ๋‚˜!

์ €์žฅํ•ด๋’€๋˜ ์ •๋ณด๋ฅผ ๊บผ๋‚ด์™€์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์ค€๋‹ค.

4. ์„ธ์…˜ ์ข…๋ฃŒ

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ•˜๊ฑฐ๋‚˜, ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด

์„œ๋ฒ„: ์ด์ œ ์ด ์„ธ์…˜์€ ๋งŒ๋ฃŒ์•ผ! ์‚ฌ์šฉ์ž ์ •๋ณด ์‚ญ์ œ!

์„ธ์…˜์ด ์‚ฌ๋ผ์ง€๊ณ , ์ž๋™ ๋กœ๊ทธ์•„์›ƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌ๋œ๋‹ค.

๐Ÿงพ ํ† ํฐ์ด๋ž€?

ํ† ํฐ์€ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‹ด์€ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋กœ, ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด ์ค‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹์ด ๋ฐ”๋กœ JWT (JSON Web Token) ์ด๋‹ค.

โœ… JWT๋ž€?

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

1. ๋กœ๊ทธ์ธ ์š”์ฒญ

์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

POST /login
{
  "username": "user1",
  "password": "1234"
}

2. ์„œ๋ฒ„๊ฐ€ JWT ๋ฐœ๊ธ‰

์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์€ JWT๋ฅผ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6..."
}

3. ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ JWT ์ €์žฅ

ํด๋ผ์ด์–ธํŠธ๋Š” ์ด JWT๋ฅผ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ๋˜๋Š” ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•œ๋‹ค.

localStorage.setItem("token", receivedToken);

4. ์ธ์ฆ ์š”์ฒญ ์‹œ JWT ์ „์†ก

ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค JWT๋ฅผ ํ—ค๋”์— ํฌํ•จํ•ด์„œ ๋ณด๋‚ธ๋‹ค.

GET /user/info
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

5. ์„œ๋ฒ„๋Š” JWT ํ™•์ธ ํ›„ ์‘๋‹ต

์„œ๋ฒ„๋Š” ํ† ํฐ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ถ”์ถœํ•ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

6. ํ† ํฐ ๋งŒ๋ฃŒ ๋˜๋Š” ์œ„์กฐ ์‹œ

๋งŒ๋ฃŒ๋œ ํ† ํฐ์ด๋ฉด 401 Unauthorized ์‘๋‹ตํ•˜๊ณ ,
์œ„์กฐ๋œ ํ† ํฐ์ด๋ฉด ์„œ๋ช… ๋ถˆ์ผ์น˜๋กœ ์š”์ฒญ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

์ตœ์ข… ์ •๋ฆฌ

๊ตฌ๋ถ„์ฟ ํ‚ค (Cookie)์„ธ์…˜ (Session)ํ† ํฐ (Token, ํŠนํžˆ JWT)
์ €์žฅ ์œ„์น˜ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์„œ๋ฒ„ํด๋ผ์ด์–ธํŠธ (์ฃผ๋กœ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€, ์„ธ์…˜์Šคํ† ๋ฆฌ์ง€)
๋ณด์•ˆ์„ฑ๋‚ฎ์Œ (์กฐ์ž‘ ๊ฐ€๋Šฅ)๋†’์Œ (์„œ๋ฒ„ ์ €์žฅ)๋น„๊ต์  ๋†’์Œ (์„œ๋ช… ๊ธฐ๋ฐ˜)
์œ ์ง€ ๋ฐฉ์‹์ž๋™ ์š”์ฒญ ์‹œ ํฌํ•จ๋จ (header์— ์ž๋™ ํฌํ•จ)์„œ๋ฒ„์—์„œ ์‹๋ณ„ ์ •๋ณด ์ €์žฅ ํ›„ ์ฟ ํ‚ค๋กœ ID ์ „๋‹ฌํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ์ „๋‹ฌ
์‚ฌ์šฉ ๋ฐฉ์‹์ƒํƒœ ๊ธฐ๋ฐ˜ (์„ธ์…˜ ID๋ฅผ ๋‹ด์Œ)์ƒํƒœ ๊ธฐ๋ฐ˜ (์„ธ์…˜ ID๋กœ ์„œ๋ฒ„์—์„œ ์ƒํƒœ ์œ ์ง€)๋ฌด์ƒํƒœ(Stateless) ๋ฐฉ์‹ (์„œ๋ฒ„๋Š” ํ† ํฐ๋งŒ ํ™•์ธ)
ํŠน์ง•ํฌ๊ธฐ ์ œํ•œ (4KB), ์ž๋™ ์ „์†ก์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ž์ฒด์— ์ธ์ฆ ์ •๋ณด ํฌํ•จ, ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ ์Œ

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

comment-user-thumbnail
2025๋…„ 6์›” 18์ผ

์ฟ ํ‚คํ† ํฐ์„ธ์…˜๋“ค์ด ์–ด๋–ป๊ฒŒ ์ด์šฉ๋˜๋Š”์ง€ ํ•˜๋‚˜ํ•˜๋‚˜ ์Šคํ† ๋ฆฌํ…”๋ง์„ ํ•˜์…”์„œ ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๋„ค์š”! ์•„๋งˆ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด JWT๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ œ์ผ ๋†’์„ํ…๋ฐ, ๊ธฐํš์ฝ”์Šค ๋™์•ˆ ๋ฐฑ์—”๋“œ๋ž‘ ๊ฐ„๋‹จํ•˜๊ฒŒ ์–˜๊ธฐํ•˜๋ฉด์„œ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๋ฏธ๋ฆฌ ๊ฑฐ์ณ๋ด๋„ ์ข‹์„๊ฑฐ ๊ฐ™์•„์—ฌ

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ