diff --git a/Network/Authentication.md b/Network/Authentication.md new file mode 100644 index 0000000..8649ea4 --- /dev/null +++ b/Network/Authentication.md @@ -0,0 +1,453 @@ +# ๐Ÿช ์ฟ ํ‚ค / ์„ธ์…˜ / JWT ์™„์ „ ์ •๋ณต ์Šคํ„ฐ๋”” ์ž๋ฃŒ + +--- + +## ๐Ÿ“‹ ๋ชฉ์ฐจ + +1. [์™œ ์ธ์ฆ์ด ํ•„์š”ํ•œ๊ฐ€ โ€” Stateless ๋ฌธ์ œ](#1-์™œ-์ธ์ฆ์ด-ํ•„์š”ํ•œ๊ฐ€) +2. [์ฟ ํ‚ค (Cookie)](#2-์ฟ ํ‚ค-cookie) +3. [์„ธ์…˜ (Session)](#3-์„ธ์…˜-session) +4. [JWT (JSON Web Token)](#4-jwt-json-web-token) +5. [์„ธ์…˜ vs JWT ๋น„๊ต ๋ฐ ์„ ํƒ ๊ธฐ์ค€](#5-์„ธ์…˜-vs-jwt) +6. [Access Token + Refresh Token ์ „๋žต](#6-access-token--refresh-token) +7. [๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ & ๋ชจ๋ฒ” ๋‹ต๋ณ€](#7-๋ฉด์ ‘-์งˆ๋ฌธ) + +--- + +## 1. ์™œ ์ธ์ฆ์ด ํ•„์š”ํ•œ๊ฐ€ + +### 1-1. HTTP๋Š” Stateless๋‹ค + +HTTP๋Š” **๋ฌด์ƒํƒœ(Stateless)** ํ”„๋กœํ† ์ฝœ์ด๋‹ค. +์„œ๋ฒ„๋Š” ์ด์ „ ์š”์ฒญ์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งค ์š”์ฒญ์€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] + |--- "๋‚˜๋Š” ํ™๊ธธ๋™์ด์•ผ, ๋กœ๊ทธ์ธ" -->| โœ… ์ธ์ฆ ์„ฑ๊ณต + | | + |--- "๋‚ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด์—ฌ์ค˜" ------->| โ“ ๋ˆ„๊ตฌ์„ธ์š”? + | | (์„œ๋ฒ„๋Š” ๊ธฐ์–ต ๋ชปํ•จ) +``` + +> ๐Ÿ’ก ์ด๊ฒƒ์ด ๋ฐ”๋กœ **์ธ์ฆ(Authentication) ์œ ์ง€ ๋ฌธ์ œ** +> ๋กœ๊ทธ์ธํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์„œ๋ฒ„๊ฐ€ ๊ณ„์† ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ โ†’ ์ฟ ํ‚ค/์„ธ์…˜/JWT๋กœ ํ•ด๊ฒฐ + +### 1-2. ์ธ์ฆ vs ์ธ๊ฐ€ + +| ์šฉ์–ด | ์˜์–ด | ์˜๋ฏธ | ์˜ˆ์‹œ | +|------|------|------|------| +| **์ธ์ฆ** | Authentication | ๋„ค๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธ | ๋กœ๊ทธ์ธ | +| **์ธ๊ฐ€** | Authorization | ๋„ค๊ฐ€ ๋ญ˜ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ | ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์ ‘๊ทผ ๊ถŒํ•œ | + +> ๐Ÿ’ก ๋ฉด์ ‘์—์„œ ์ž์ฃผ ํ˜ผ๋™๋จ. ์ธ์ฆ ๋จผ์ €, ์ธ๊ฐ€๋Š” ๊ทธ ๋‹ค์Œ ๋‹จ๊ณ„. + +--- + +## 2. ์ฟ ํ‚ค (Cookie) + +### 2-1. ์ฟ ํ‚ค๋ž€? + +**์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ** +์ดํ›„ ์š”์ฒญ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•œ๋‹ค. + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] + |--- POST /login --------------->| + | | + |<-- Set-Cookie: userId=123 -----| โ† ์„œ๋ฒ„๊ฐ€ ์ฟ ํ‚ค ๋ฐœ๊ธ‰ + | | + |--- GET /mypage | + | Cookie: userId=123 -------->| โ† ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ „์†ก + | | โœ… ์„œ๋ฒ„๊ฐ€ userId=123 ํ™•์ธ +``` + +### 2-2. ์ฟ ํ‚ค ์†์„ฑ (Options) + +```http +Set-Cookie: sessionId=abc123; + Max-Age=3600; + Domain=example.com; + Path=/; + Secure; + HttpOnly; + SameSite=Strict +``` + +| ์†์„ฑ | ์„ค๋ช… | +|------|------| +| `Max-Age` / `Expires` | ์ฟ ํ‚ค ์œ ํšจ๊ธฐ๊ฐ„. ์—†์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ (์„ธ์…˜ ์ฟ ํ‚ค) | +| `Domain` | ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๋„๋ฉ”์ธ | +| `Path` | ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•  ๊ฒฝ๋กœ | +| `Secure` | HTTPS ์—ฐ๊ฒฐ์—์„œ๋งŒ ์ „์†ก | +| `HttpOnly` | JavaScript์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€ โ†’ XSS ๋ฐฉ์–ด | +| `SameSite` | ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์‹œ ์ฟ ํ‚ค ์ „์†ก ์—ฌ๋ถ€ โ†’ CSRF ๋ฐฉ์–ด | + +### 2-3. SameSite ์˜ต์…˜ ์ƒ์„ธ + +| ๊ฐ’ | ๋™์ž‘ | +|----|------| +| `Strict` | ๊ฐ™์€ ์‚ฌ์ดํŠธ ์š”์ฒญ์—์„œ๋งŒ ์ „์†ก. ๊ฐ€์žฅ ๋ณด์•ˆ์  | +| `Lax` | ๊ธฐ๋ณธ๊ฐ’. ์™ธ๋ถ€ ๋งํฌ๋กœ ์ด๋™ ์‹œ GET ์š”์ฒญ์—๋Š” ์ „์†ก | +| `None` | ๋ชจ๋“  ์š”์ฒญ์— ์ „์†ก (๋ฐ˜๋“œ์‹œ `Secure` ํ•จ๊ป˜ ์‚ฌ์šฉ) | + +### 2-4. ์ฟ ํ‚ค์˜ ๋ณด์•ˆ ์ทจ์•ฝ์  + +#### XSS (Cross-Site Scripting) +``` +์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ: document.cookie โ† HttpOnly ์—†์œผ๋ฉด ์ฟ ํ‚ค ํƒˆ์ทจ ๊ฐ€๋Šฅ +๋Œ€์‘์ฑ…: HttpOnly ์†์„ฑ ์„ค์ • +``` + +#### CSRF (Cross-Site Request Forgery) +``` +์ƒํ™ฉ: ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์•…์„ฑ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ + โ†’ ์•…์„ฑ ์‚ฌ์ดํŠธ๊ฐ€ ๋ชฐ๋ž˜ ์€ํ–‰ ์ด์ฒด ์š”์ฒญ ์ „์†ก + โ†’ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ์ฟ ํ‚ค ์ฒจ๋ถ€ +๋Œ€์‘์ฑ…: SameSite=Strict, CSRF ํ† ํฐ ์‚ฌ์šฉ +``` + +### 2-5. ์ฟ ํ‚ค ์ €์žฅ ์œ„์น˜ ๋น„๊ต + +| ์ €์žฅ์†Œ | ์šฉ๋Ÿ‰ | ์„œ๋ฒ„ ์ „์†ก | ์œ ํšจ๊ธฐ๊ฐ„ | JS ์ ‘๊ทผ | +|--------|------|-----------|----------|---------| +| **Cookie** | 4KB | โœ… ์ž๋™ | ์„ค์ • ๊ฐ€๋Šฅ | ์„ค์ • ๊ฐ€๋Šฅ | +| **LocalStorage** | 5~10MB | โŒ | ์˜๊ตฌ | โœ… | +| **SessionStorage** | 5~10MB | โŒ | ํƒญ ์ข…๋ฃŒ ์‹œ | โœ… | + +> ๐Ÿ’ก ์ธ์ฆ ํ† ํฐ์„ LocalStorage์— ์ €์žฅํ•˜๋ฉด XSS์— ์ทจ์•ฝ +> ๋ฏผ๊ฐํ•œ ์ธ์ฆ ์ •๋ณด๋Š” **HttpOnly ์ฟ ํ‚ค**์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ + +--- + +## 3. ์„ธ์…˜ (Session) + +### 3-1. ์„ธ์…˜์ด๋ž€? + +**์„œ๋ฒ„ ์ธก์— ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—๋Š” ์„ธ์…˜ ID๋งŒ ์ฟ ํ‚ค๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹** + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] [์„ธ์…˜ ์ €์žฅ์†Œ] + |--- POST /login (ID/PW) ----------->| | + | |-- ์„ธ์…˜ ์ƒ์„ฑ --------------->| + | | { sid: "abc", user: ํ™๊ธธ๋™ }| + |<-- Set-Cookie: sid=abc ------------| | + | | | + |--- GET /mypage | | + | Cookie: sid=abc --------------->|-- ์„ธ์…˜ ์กฐํšŒ --------------->| + | |<-- { user: ํ™๊ธธ๋™ } --------| + |<-- ํ™๊ธธ๋™์˜ ๋งˆ์ดํŽ˜์ด์ง€ --------------| | +``` + +### 3-2. ์„ธ์…˜ ๋™์ž‘ ๋‹จ๊ณ„ + +1. **๋กœ๊ทธ์ธ**: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ ์ „์†ก +2. **๊ฒ€์ฆ**: ์„œ๋ฒ„๊ฐ€ DB์—์„œ ์‚ฌ์šฉ์ž ํ™•์ธ +3. **์„ธ์…˜ ์ƒ์„ฑ**: ์„œ๋ฒ„๊ฐ€ ๊ณ ์œ ํ•œ ์„ธ์…˜ ID ์ƒ์„ฑ โ†’ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ +4. **์ฟ ํ‚ค ๋ฐœ๊ธ‰**: ํด๋ผ์ด์–ธํŠธ์— ์„ธ์…˜ ID๋งŒ ์ฟ ํ‚ค๋กœ ์ „๋‹ฌ +5. **์ดํ›„ ์š”์ฒญ**: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ธ์…˜ ID ์ฟ ํ‚ค๋ฅผ ์ž๋™ ์ „์†ก โ†’ ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ์ €์žฅ์†Œ ์กฐํšŒ + +### 3-3. ์„ธ์…˜ ์ €์žฅ์†Œ ์ข…๋ฅ˜ + +| ์ €์žฅ์†Œ | ํŠน์ง• | ๋‹จ์  | +|--------|------|------| +| **์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ** | ๊ฐ€์žฅ ๋น ๋ฆ„, ๊ตฌํ˜„ ์‰ฌ์›€ | ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ์‹œ ์†Œ๋ฉธ, ์Šค์ผ€์ผ ์•„์›ƒ ๋ถˆ๊ฐ€ | +| **DB (MySQL ๋“ฑ)** | ์˜์†์„ฑ ์žˆ์Œ | ๋งค ์š”์ฒญ๋งˆ๋‹ค DB ์กฐํšŒ โ†’ ๋А๋ฆผ | +| **Redis** | ๋น ๋ฆ„ + ์˜์†์„ฑ + ๊ณต์œ  ๊ฐ€๋Šฅ | ์ธํ”„๋ผ ์ถ”๊ฐ€ ํ•„์š” | + +> ๐Ÿ’ก ์‹ค๋ฌด์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ **Redis**๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ + +### 3-4. ์„ธ์…˜์˜ ํ•œ๊ณ„ โ€” ์Šค์ผ€์ผ ์•„์›ƒ ๋ฌธ์ œ + +``` +์„œ๋ฒ„ 1๋Œ€์ผ ๋•Œ: + ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„A (์„ธ์…˜ ์ €์žฅ) โ†’ ๋ฌธ์ œ์—†์Œ + +์„œ๋ฒ„ ์—ฌ๋Ÿฌ ๋Œ€์ผ ๋•Œ (๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ): + ํด๋ผ์ด์–ธํŠธ โ†’ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ โ†’ ์„œ๋ฒ„A (์„ธ์…˜ ์ €์žฅ) + ๋‹ค์Œ ์š”์ฒญ โ†’ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ โ†’ ์„œ๋ฒ„B (์„ธ์…˜ ์—†์Œ!) โ† ๋ฌธ์ œ! +``` + +**ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:** +- **Sticky Session**: ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์„œ๋ฒ„๋กœ ๋ผ์šฐํŒ… โ†’ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํšจ์œจ ์ €ํ•˜ +- **์„ธ์…˜ ๊ณต์œ  ์ €์žฅ์†Œ**: Redis ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ๊ณต์œ  โ†’ ์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ์ฑ… +- **JWT ์‚ฌ์šฉ**: ์„œ๋ฒ„์— ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์Œ โ†’ Stateless ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ + +--- + +## 4. JWT (JSON Web Token) + +### 4-1. JWT๋ž€? + +**์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ํ† ํฐ ์ž์ฒด์— ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹** +์„œ๋ฒ„๋Š” ํ† ํฐ์˜ ์œ ํšจ์„ฑ๋งŒ ๊ฒ€์ฆํ•˜๋ฉด ๋จ โ†’ **Stateless** + +``` +์„ธ์…˜ ๋ฐฉ์‹: ์„œ๋ฒ„๊ฐ€ ์ƒํƒœ ์ €์žฅ +JWT ๋ฐฉ์‹: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ(์ƒํƒœ) ๋ณด๊ด€, ์„œ๋ฒ„๋Š” ๊ฒ€์ฆ๋งŒ +``` + +### 4-2. JWT ๊ตฌ์กฐ + +JWT๋Š” **`.`(์ )์œผ๋กœ ๊ตฌ๋ถ„๋œ 3๊ฐœ์˜ ํŒŒํŠธ**๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. + +``` +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 +.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Iu2Zjeq4uOuPmSIsImlhdCI6MTUxNjIzOTAyMn0 +.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + +[ Header ].[ Payload ].[ Signature ] +``` + +#### Header (ํ—ค๋”) +```json +{ + "alg": "HS256", // ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ + "typ": "JWT" // ํ† ํฐ ํƒ€์ž… +} +``` + +#### Payload (ํŽ˜์ด๋กœ๋“œ) +```json +{ + "sub": "1234567890", // Subject (์‚ฌ์šฉ์ž ID) + "name": "ํ™๊ธธ๋™", + "role": "admin", + "iat": 1516239022, // Issued At (๋ฐœ๊ธ‰ ์‹œ๊ฐ„) + "exp": 1516242622 // Expiration (๋งŒ๋ฃŒ ์‹œ๊ฐ„) +} +``` + +> โš ๏ธ **Payload๋Š” Base64 ์ธ์ฝ”๋”ฉ๋งŒ ๋œ ๊ฒƒ, ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹˜!** +> ๋ˆ„๊ตฌ๋‚˜ ๋””์ฝ”๋”ฉํ•ด์„œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ โ†’ ๋ฏผ๊ฐํ•œ ์ •๋ณด(๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ) ์ ˆ๋Œ€ ํฌํ•จ ๊ธˆ์ง€ + +#### Signature (์„œ๋ช…) +``` +HMACSHA256( + base64UrlEncode(header) + "." + base64UrlEncode(payload), + secretKey โ† ์„œ๋ฒ„๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๋น„๋ฐ€ํ‚ค +) +``` + +- ์„œ๋ฒ„์˜ ๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช… โ†’ ํ† ํฐ ์œ„๋ณ€์กฐ ๊ฐ์ง€ ๊ฐ€๋Šฅ +- ํด๋ผ์ด์–ธํŠธ๊ฐ€ Payload๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ์„œ๋ช… ๊ฒ€์ฆ ์‹คํŒจ + +### 4-3. JWT ๋™์ž‘ ํ๋ฆ„ + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] + |--- POST /login (ID/PW) ------->| + | | 1. ์‚ฌ์šฉ์ž ๊ฒ€์ฆ + | | 2. JWT ์ƒ์„ฑ (๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…) + |<-- JWT ํ† ํฐ ๋ฐœ๊ธ‰ ---------------| + | (ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ €์žฅ) | + | | + |--- GET /mypage | + | Authorization: Bearer {JWT} | + |-------------------------------->| + | | 3. ์„œ๋ช… ๊ฒ€์ฆ (๋น„๋ฐ€ํ‚ค๋กœ) + | | 4. Payload์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ์ถ”์ถœ + |<-- ๋งˆ์ดํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ --------------| (DB ์กฐํšŒ ์—†์ด!) +``` + +### 4-4. JWT ์ €์žฅ ์œ„์น˜ + +| ์ €์žฅ ์œ„์น˜ | ์žฅ์  | ๋‹จ์  | +|-----------|------|------| +| **LocalStorage** | ๊ตฌํ˜„ ์‰ฌ์›€ | XSS ๊ณต๊ฒฉ์œผ๋กœ ํƒˆ์ทจ ๊ฐ€๋Šฅ | +| **SessionStorage** | ํƒญ ์ข…๋ฃŒ ์‹œ ์‚ญ์ œ | XSS ์ทจ์•ฝ, ํƒญ ๊ฐ„ ๊ณต์œ  ๋ถˆ๊ฐ€ | +| **HttpOnly Cookie** | XSS ๋ฐฉ์–ด | CSRF ์ทจ์•ฝ (SameSite๋กœ ๋ฐฉ์–ด) | + +> ๐Ÿ’ก ๋ณด์•ˆ์ƒ **HttpOnly Cookie**์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋จ +> LocalStorage๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ XSS์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ๋ณด์•ˆ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค์—๋Š” ๋ถ€์ ํ•ฉ + +### 4-5. JWT์˜ ๋‹จ์  + +#### 1. ๊ฐ•์ œ ๋งŒ๋ฃŒ ๋ถˆ๊ฐ€ +``` +์ƒํ™ฉ: ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒํ–ˆ๋Š”๋ฐ ํ† ํฐ์ด ์•„์ง ์œ ํšจ๊ธฐ๊ฐ„ ๋‚ด + โ†’ ํƒˆ์ทจ๋œ ํ† ํฐ์„ ๋งŒ๋ฃŒ ์ „๊นŒ์ง€ ์‚ฌ์šฉ ๊ฐ€๋Šฅ + +์„ธ์…˜ ๋ฐฉ์‹: ์„ธ์…˜ ์‚ญ์ œ โ†’ ์ฆ‰์‹œ ๋ฌดํšจํ™” ๊ฐ€๋Šฅ +JWT ๋ฐฉ์‹: ์„œ๋ฒ„์— ์ €์žฅ๋œ ๊ฒŒ ์—†์Œ โ†’ ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ง‰์„ ์ˆ˜ ์—†์Œ +``` + +**ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:** +- ํ† ํฐ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ • (5~15๋ถ„) +- ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ DB์— ๋ฌดํšจ ํ† ํฐ ์ €์žฅ โ†’ ๊ฒฐ๊ตญ ์„œ๋ฒ„ ์ƒํƒœ๊ฐ€ ์ƒ๊น€ (๋‹จ์  ์ƒ์‡„) + +#### 2. Payload ํฌ๊ธฐ +- ์„ธ์…˜: ํด๋ผ์ด์–ธํŠธ์— ID๋งŒ ์ „์†ก (์ˆ˜์‹ญ ๋ฐ”์ดํŠธ) +- JWT: ํ† ํฐ ์ž์ฒด์— ์ •๋ณด ํฌํ•จ โ†’ ์š”์ฒญ๋งˆ๋‹ค ์ˆ˜๋ฐฑ ๋ฐ”์ดํŠธ ์ถ”๊ฐ€ + +#### 3. ๋น„๋ฐ€ํ‚ค ๋…ธ์ถœ ์‹œ ์ „์ฒด ์œ„ํ—˜ +- ์„œ๋ช…์— ์‚ฌ์šฉํ•˜๋Š” ๋น„๋ฐ€ํ‚ค๊ฐ€ ์œ ์ถœ๋˜๋ฉด ๋ชจ๋“  ํ† ํฐ ์œ„๋ณ€์กฐ ๊ฐ€๋Šฅ + +--- + +## 5. ์„ธ์…˜ vs JWT + +### 5-1. ์ „์ฒด ๋น„๊ตํ‘œ + +| ํ•ญ๋ชฉ | ์„ธ์…˜ | JWT | +|------|------|-----| +| ์ƒํƒœ ์ €์žฅ ์œ„์น˜ | **์„œ๋ฒ„** (์„ธ์…˜ ์ €์žฅ์†Œ) | **ํด๋ผ์ด์–ธํŠธ** (ํ† ํฐ) | +| ์„œ๋ฒ„ Stateless | โŒ Stateful | โœ… Stateless | +| ํ™•์žฅ์„ฑ | ๊ณต์œ  ์ €์žฅ์†Œ ํ•„์š” | ์œ ๋ฆฌ (์„œ๋ฒ„ ๊ฐ„ ๊ณต์œ  ๋ถˆํ•„์š”) | +| ๊ฐ•์ œ ๋งŒ๋ฃŒ | โœ… ์ฆ‰์‹œ ๊ฐ€๋Šฅ | โŒ ์–ด๋ ค์›€ | +| DB ์กฐํšŒ | ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ•„์š” | ๋ถˆํ•„์š” (์„œ๋ช… ๊ฒ€์ฆ๋งŒ) | +| ๋ณด์•ˆ | ์„ธ์…˜ ID ํƒˆ์ทจ ์œ„ํ—˜ | ํ† ํฐ ํƒˆ์ทจ ์œ„ํ—˜ | +| ํ† ํฐ ํฌ๊ธฐ | ์ž‘์Œ (ID๋งŒ) | ์ƒ๋Œ€์ ์œผ๋กœ ํผ | + +### 5-2. ์–ธ์ œ ์„ธ์…˜์„ ์“ธ๊นŒ? + +- **๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ์ด ์ค‘์š”ํ•œ ์„œ๋น„์Šค** (๊ธˆ์œต, ๋ณด์•ˆ ๋ฏผ๊ฐ ์„œ๋น„์Šค) +- **์„œ๋ฒ„ ์ˆ˜๊ฐ€ ์ ๊ณ  ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์ง€ ์•Š์€ ์„œ๋น„์Šค** +- **์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ** (๊ด€๋ฆฌ์ž๊ฐ€ ํŠน์ • ๊ณ„์ • ๊ฐ•์ œ ์ข…๋ฃŒ ๋“ฑ) + +### 5-3. ์–ธ์ œ JWT๋ฅผ ์“ธ๊นŒ? + +- **๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜** (์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ํ† ํฐ๋งŒ ๊ฒ€์ฆํ•˜๋ฉด ๋จ) +- **์„œ๋ฒ„ ์Šค์ผ€์ผ ์•„์›ƒ์ด ์žฆ์€ ์„œ๋น„์Šค** +- **๋ชจ๋ฐ”์ผ ์•ฑ** (์ฟ ํ‚ค ๊ด€๋ฆฌ๋ณด๋‹ค ํ† ํฐ ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌ) +- **์™ธ๋ถ€ ์„œ๋น„์Šค์™€์˜ API ์—ฐ๋™** (OAuth ๋“ฑ) + +--- + +## 6. Access Token + Refresh Token + +### 6-1. ์™œ ๋‘ ์ข…๋ฅ˜์˜ ํ† ํฐ์ด ํ•„์š”ํ•œ๊ฐ€? + +JWT์˜ ๊ฐ•์ œ ๋งŒ๋ฃŒ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต. + +``` +Access Token : ์œ ํšจ๊ธฐ๊ฐ„ ์งง์Œ (5~15๋ถ„) โ€” ์‹ค์ œ API ์š”์ฒญ์— ์‚ฌ์šฉ +Refresh Token : ์œ ํšจ๊ธฐ๊ฐ„ ๊น€ (7~30์ผ) โ€” Access Token ์žฌ๋ฐœ๊ธ‰์—๋งŒ ์‚ฌ์šฉ +``` + +- Access Token ํƒˆ์ทจ๋‹นํ•ด๋„ โ†’ ๋น ๋ฅด๊ฒŒ ๋งŒ๋ฃŒ๋จ (ํ”ผํ•ด ์ตœ์†Œํ™”) +- Refresh Token์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์ฃผ ๋กœ๊ทธ์ธ ์•ˆ ํ•ด๋„ ๋จ + +### 6-2. ์ „์ฒด ๋™์ž‘ ํ๋ฆ„ + +``` +[ํด๋ผ์ด์–ธํŠธ] [์„œ๋ฒ„] + |--- POST /login (ID/PW) ----------->| + |<-- Access Token (15๋ถ„) | + | Refresh Token (7์ผ) ------------| + | | + |--- GET /api (Access Token) ------->| โœ… ์ •์ƒ ์‘๋‹ต + |--- GET /api (Access Token) ------->| โœ… ์ •์ƒ ์‘๋‹ต + | ...15๋ถ„ ํ›„... | + |--- GET /api (๋งŒ๋ฃŒ๋œ Access Token) ->| โŒ 401 ๋ฐ˜ํ™˜ + | | + |--- POST /refresh (Refresh Token) ->| Refresh Token ๊ฒ€์ฆ + |<-- ์ƒˆ๋กœ์šด Access Token -------------| + | | + |--- GET /api (์ƒˆ Access Token) ----->| โœ… ์ •์ƒ ์‘๋‹ต +``` + +### 6-3. Refresh Token ๋ณด์•ˆ ์ „๋žต + +#### Refresh Token Rotation +- Refresh Token์„ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Refresh Token ๋ฐœ๊ธ‰ +- ์ด์ „ Refresh Token์€ ์ฆ‰์‹œ ๋ฌดํšจํ™” +- โ†’ ํƒˆ์ทจ๋œ Refresh Token ์žฌ์‚ฌ์šฉ ๊ฐ์ง€ ๊ฐ€๋Šฅ + +``` +์ •์ƒ ํ๋ฆ„: + RT-1 ์‚ฌ์šฉ โ†’ RT-2 ๋ฐœ๊ธ‰, RT-1 ๋ฌดํšจํ™” + RT-2 ์‚ฌ์šฉ โ†’ RT-3 ๋ฐœ๊ธ‰, RT-2 ๋ฌดํšจํ™” + +ํƒˆ์ทจ ๊ฐ์ง€: + RT-2 ์‚ฌ์šฉ โ†’ RT-3 ๋ฐœ๊ธ‰ + ๊ณต๊ฒฉ์ž๊ฐ€ RT-2๋กœ ์žฌ์‹œ๋„ โ†’ ์ด๋ฏธ ๋ฌดํšจํ™”๋œ RT-2 ์‚ฌ์šฉ ๊ฐ์ง€! + โ†’ ๋ชจ๋“  ์„ธ์…˜ ๊ฐ•์ œ ์ข…๋ฃŒ +``` + +#### Refresh Token ์ €์žฅ ์œ„์น˜ +- ์„œ๋ฒ„ DB ๋˜๋Š” Redis์— ์ €์žฅ (ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹) +- ํด๋ผ์ด์–ธํŠธ์—๋Š” HttpOnly Cookie๋กœ ์ „๋‹ฌ + +### 6-4. ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ + +| ๋ฐฉ์‹ | ์ฒ˜๋ฆฌ | +|------|------| +| ์„ธ์…˜ | ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ์‚ญ์ œ โ†’ ์ฆ‰์‹œ ๋ฌดํšจํ™” | +| JWT | Access Token ์งง๊ฒŒ ๋งŒ๋ฃŒ ๋Œ€๊ธฐ + Refresh Token ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋“ฑ๋ก | + +--- + +## 7. ๋ฉด์ ‘ ์งˆ๋ฌธ + +### Q1. ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ์ฐจ์ด์ ์€? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> ์ฟ ํ‚ค๋Š” ์ƒํƒœ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์— ์ €์žฅํ•˜๊ณ , ์„ธ์…˜์€ ์„œ๋ฒ„์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ์— ์ง์ ‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด ํƒˆ์ทจ ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ, ์„ธ์…˜์€ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  ํด๋ผ์ด์–ธํŠธ์—๋Š” ์„ธ์…˜ ID๋งŒ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์„ธ์…˜์€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ถ€๋‹ด์ด ๋ฉ๋‹ˆ๋‹ค. + +--- + +### Q2. JWT์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”. + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> JWT๋Š” Header, Payload, Signature ์„ธ ๋ถ€๋ถ„์ด ์ (.)์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. Header์—๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ† ํฐ ํƒ€์ž…, Payload์—๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๋“ฑ์˜ ํด๋ ˆ์ž„์ด ๋‹ด๊น๋‹ˆ๋‹ค. Signature๋Š” Header์™€ Payload๋ฅผ ์„œ๋ฒ„์˜ ๋น„๋ฐ€ํ‚ค๋กœ ์„œ๋ช…ํ•œ ๊ฐ’์œผ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ํ† ํฐ์˜ ์œ„๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. Payload๋Š” ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹Œ Base64 ์ธ์ฝ”๋”ฉ์ด๋ฏ€๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋‹ด์œผ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. + +--- + +### Q3. ์„ธ์…˜ vs JWT, ์–ธ์ œ ๋ญ˜ ์‚ฌ์šฉํ•˜๋‚˜์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ์„ธ์…˜ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ธˆ์œต/๋ณด์•ˆ ์„œ๋น„์Šค๋Š” ์„ธ์…˜์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์ˆ˜ํ‰ ํ™•์žฅ์ด ์žฆ์€ ๊ฒฝ์šฐ๋Š” JWT๊ฐ€ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. JWT๋Š” Stateless๋ผ ์„œ๋ฒ„ ๊ฐ„ ์„ธ์…˜ ๊ณต์œ  ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ๋‘ ๋ฐฉ์‹์„ ์กฐํ•ฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. + +--- + +### Q4. JWT๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ•์ œ ๋งŒ๋ฃŒ์‹œํ‚ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> JWT๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„์— ์ƒํƒœ๊ฐ€ ์—†์–ด ๊ฐ•์ œ ๋งŒ๋ฃŒ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ฒซ์งธ, Access Token ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ (5~15๋ถ„) ์„ค์ •ํ•˜๊ณ  Refresh Token์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ํ•˜๋Š” ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ๋กœ๊ทธ์•„์›ƒ ์‹œ ํ•ด๋‹น ํ† ํฐ์„ DB๋‚˜ Redis์˜ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ๋“ฑ๋กํ•˜๊ณ  ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋‘ ๋ฒˆ์งธ ๋ฐฉ์‹์€ ์„œ๋ฒ„์— ์ƒํƒœ๊ฐ€ ์ƒ๊ธฐ๋ฏ€๋กœ Stateless์˜ ์žฅ์ ์ด ์ผ๋ถ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. + +--- + +### Q5. Access Token๊ณผ Refresh Token์˜ ์ฐจ์ด๋Š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> Access Token์€ ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง๊ณ (5~15๋ถ„) ์‹ค์ œ API ์š”์ฒญ ์‹œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Refresh Token์€ ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธธ๊ณ (7~30์ผ) Access Token์ด ๋งŒ๋ฃŒ๋์„ ๋•Œ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Access Token์ด ํƒˆ์ทจ๋˜๋”๋ผ๋„ ์งง์€ ์‹œ๊ฐ„ ๋‚ด์— ๋งŒ๋ฃŒ๋˜๋ฏ€๋กœ ํ”ผํ•ด๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Refresh Token์€ ๋ณด์•ˆ์„ ์œ„ํ•ด HttpOnly Cookie๋‚˜ ์„œ๋ฒ„ DB์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. + +--- + +### Q6. XSS์™€ CSRF๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ๋ฐฉ์–ดํ•˜๋‚˜์š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•ด ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค. ์ฟ ํ‚ค์˜ HttpOnly ์†์„ฑ๊ณผ Content Security Policy๋กœ ๋ฐฉ์–ดํ•ฉ๋‹ˆ๋‹ค. CSRF๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๋ชฐ๋ž˜ ๋ณด๋‚ด๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ์œผ๋กœ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์ž๋™ ์ „์†กํ•˜๋Š” ํŠน์„ฑ์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค. SameSite ์ฟ ํ‚ค ์†์„ฑ๊ณผ CSRF ํ† ํฐ์œผ๋กœ ๋ฐฉ์–ดํ•ฉ๋‹ˆ๋‹ค. + +--- + +### Q7. ์ฟ ํ‚ค๋ฅผ LocalStorage ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”? + +**๋ชจ๋ฒ” ๋‹ต๋ณ€:** +> ์ธ์ฆ ํ† ํฐ์„ LocalStorage์— ์ €์žฅํ•˜๋ฉด JavaScript๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด XSS ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด HttpOnly ์†์„ฑ์„ ๊ฐ€์ง„ ์ฟ ํ‚ค๋Š” JavaScript์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด XSS๋กœ๋ถ€ํ„ฐ ํ† ํฐ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  CSRF ๊ณต๊ฒฉ์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ SameSite ์†์„ฑ๊ณผ CSRF ํ† ํฐ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +--- + +## ๐Ÿ“Œ ํ•ต์‹ฌ ์š”์•ฝ ์นด๋“œ + +``` +Stateless = HTTP๋Š” ์ƒํƒœ๋ฅผ ๊ธฐ์–ต ๋ชปํ•จ โ†’ ์ธ์ฆ ์œ ์ง€ ์ˆ˜๋‹จ ํ•„์š” + +์ฟ ํ‚ค = ์„œ๋ฒ„๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅํ•˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ + HttpOnly(XSS ๋ฐฉ์–ด) + SameSite(CSRF ๋ฐฉ์–ด) + +์„ธ์…˜ = ์„œ๋ฒ„๊ฐ€ ์ƒํƒœ ์ €์žฅ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„ธ์…˜ ID๋งŒ ๋ณด๊ด€ + ๊ฐ•์ œ ๋งŒ๋ฃŒ โœ… | ์Šค์ผ€์ผ ์•„์›ƒ ์–ด๋ ค์›€ โš ๏ธ + +JWT = ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ† ํฐ(์ƒํƒœ) ๋ณด๊ด€, ์„œ๋ฒ„๋Š” ๊ฒ€์ฆ๋งŒ + Header.Payload.Signature ๊ตฌ์กฐ + Payload = Base64 ์ธ์ฝ”๋”ฉ (์•”ํ˜ธํ™” โŒ) + Stateless โœ… | ๊ฐ•์ œ ๋งŒ๋ฃŒ ์–ด๋ ค์›€ โš ๏ธ + +Access + Refresh = ์งง์€ ์ˆ˜๋ช…(Access) + ๊ธด ์ˆ˜๋ช…(Refresh) + ํƒˆ์ทจ ํ”ผํ•ด ์ตœ์†Œํ™” + ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์œ ์ง€ +``` + +--- + +*์ฐธ๊ณ : HTTP/HTTPS ์Šคํ„ฐ๋”” ์ž๋ฃŒ์™€ ํ•จ๊ป˜ ๋ณด๋ฉด ๋” ์ดํ•ด๊ฐ€ ์ž˜ ๋จ | ๋ฉด์ ‘ ์Šคํ„ฐ๋””์šฉ*