HTTPS / JWT / CSRF ๊ฐ๋ ์ ๋ฆฌ
๐ HTTPS์ ์ญํ ๊ณผ ์ค์์ฑ
1๏ธโฃ HTTPS๋?
**HTTPS (HyperText Transfer Protocol Secure)**๋ HTTP + SSL/TLS๋ฅผ ๊ฒฐํฉํ ํ๋กํ ์ฝ์ด๋ค.
์ฆ, HTTP ํต์ ์ ์ํธํํ์ฌ ์์ ํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค.
๐ก HTTP vs HTTPS
HTTPHTTPS
๋ณด์ ์์ค | ์ํธํ ์์ (ํ๋ฌธ ํต์ ) | ์ํธํ (TLS/SSL ์ ์ฉ) |
๋ฐ์ดํฐ ๋ณดํธ | ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ ํ์ทจ ๊ฐ๋ฅ | ๋ฐ์ดํฐ ์ํธํ๋ก ๋ณดํธ |
์ฌ์ฉ ์ฌ๋ก | ์ผ๋ฐ ์น์ฌ์ดํธ (๋ณด์ ์ค์X) | ๋ก๊ทธ์ธ, ๊ฒฐ์ , ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ ๋ฑ |
๋ธ๋ผ์ฐ์ ํ์ | ๐ด "์์ ํ์ง ์์" ๊ฒฝ๊ณ | ๐ข ์๋ฌผ์ ์์ด์ฝ (๐) ํ์ |
2๏ธโฃ HTTPS์ ์ฃผ์ ์ญํ
โ
1) ๋ฐ์ดํฐ ์ํธํ (Encryption) → ๋ฐ์ดํฐ ํ์ทจ ๋ฐฉ์ง
โ
2) ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ (Integrity) → ๋ฐ์ดํฐ ๋ณ์กฐ ๋ฐฉ์ง
โ
3) ์๋ฒ ์ธ์ฆ (Authentication) → ์ ๋ขฐํ ์ ์๋ ์๋ฒ์ ํต์ ๋ณด์ฅ
๐ 1. ๋ฐ์ดํฐ ์ํธํ (Encryption)
HTTPS๋ SSL/TLS ์ํธํ๋ฅผ ์ ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ค.
์ฆ, ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ ์๋ฒ๊ฐ ์ํธํ๋ ์ํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ๋๋ฌธ์, ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๊ฐ ๋
ธ์ถ๋์ง ์๋๋ค.
๐ก HTTP ํต์ (์ํธํ X)
Host: example.com
username=admin&password=1234
โ ๊ณต๊ฒฉ์๊ฐ ๋คํธ์ํฌ์์ ํจํท์ ๊ฐ๋ก์ฑ๋ฉด ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๊ทธ๋๋ก ๋ ธ์ถ๋จ.
๐ก HTTPS ํต์ (์ํธํ O)
Host: example.com
[์ํธํ๋ ๋ฐ์ดํฐ]
โ ๊ณต๊ฒฉ์๊ฐ ํจํท์ ๊ฐ๋ก์ฑ๋๋ผ๋ ๋ด์ฉ์ ํด๋ ํ ์ ์์.
๐น ์ํธํ ๋ฐฉ์
- HTTPS๋ TLS(Transport Layer Security) ๋๋ **SSL(Secure Sockets Layer)**์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ๋ค.
- ์ฌ์ฉ๋๋ ์ํธํ ๋ฐฉ์:
- ๋์นญํค ์ํธํ: AES, ChaCha20 (๋น ๋ฅด๊ณ ๊ฐ๋ ฅํ ์ํธํ)
- ๋น๋์นญํค ์ํธํ: RSA, ECC (๊ณต๊ฐํค-๊ฐ์ธํค ์ฌ์ฉ)
๐ 2. ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ (Integrity)
HTTPS๋ ๋ฐ์ดํฐ ๋ณ์กฐ๋ฅผ ๋ฐฉ์งํ๋ค.
์ฆ, ์ ์ก ์ค์ ๊ณต๊ฒฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ๋ณดํธํ๋ค.
๐น HTTP์์๋ ๊ณต๊ฒฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ์กฐํ ์ ์์
Host: example.com
๐ฅ ๊ณต๊ฒฉ์๊ฐ ์ค๊ฐ์์ ์๋ต์ ๋ณ์กฐํ์ฌ ์ ์ฑ ์ฝ๋ ์ถ๊ฐ:
Content-Type: text/html
<html>
<script>alert('Hacked!')</script>
</html>
→ ๊ฒฐ๊ณผ: ์ฌ์ฉ์๊ฐ ์ ์ฑ ์ฝ๋๊ฐ ์ฝ์ ๋ ํ์ด์ง๋ฅผ ๋ณด๊ฒ ๋จ.
๐น HTTPS์์๋ ๋ฐ์ดํฐ ๋ณ์กฐ๊ฐ ๋ถ๊ฐ๋ฅ
- TLS๋ **๋ฉ์์ง ์ธ์ฆ ์ฝ๋(MAC, Message Authentication Code)**๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํจ.
- ์ฆ, ๊ณต๊ฒฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณ์กฐํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์ฐ๊ฒฐ์ ์ฐจ๋จํจ.
๐ 3. ์๋ฒ ์ธ์ฆ (Authentication)
HTTPS๋ ํด๋ผ์ด์ธํธ(์ฌ์ฉ์)๊ฐ ์ ๋ขฐํ ์ ์๋ ์๋ฒ์ ์ฐ๊ฒฐ๋์๋์ง ํ์ธํ๋ ์ญํ ์ ํ๋ค.
์ฆ, ํผ์ฑ ์ฌ์ดํธ(๊ฐ์ง ์ฌ์ดํธ)๋ก ์ ๋๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
๐ ํผ์ฑ ๊ณต๊ฒฉ ์์ (HTTP)
- ์ฌ์ฉ์๊ฐ http://bank.example.com์ ์ ์ํ๋ค๊ณ ์๊ฐํจ.
- ๊ณต๊ฒฉ์๊ฐ DNS๋ฅผ ๋ณ์กฐํ์ฌ http://fake-bank.com์ผ๋ก ์ ๋ํจ.
- ์ฌ์ฉ์๋ ๊ฐ์ง ์ํ ์ฌ์ดํธ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๊ณ , ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ํ์ทจํจ.
๐ HTTPS ์ฌ์ฉ ์ ๋ฐฉ์ด
- HTTPS๋ ์๋ฒ๊ฐ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ขฐํ ์ ์๋ ๋๋ฉ์ธ์ธ์ง ๊ฒ์ฆํ๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ์ธ์ฆ์๋ฅผ ํ์ธํ๊ณ ๊ฐ์ง ์ฌ์ดํธ๋ผ๋ฉด "์ํ" ๊ฒฝ๊ณ ๋ฅผ ํ์ํ๋ค.
๐ก ๋ธ๋ผ์ฐ์ ์์ HTTPS ์ธ์ฆ ํ์ธ
- ์ฃผ์์ฐฝ ์๋ฌผ์ ์์ด์ฝ ๐ ํด๋ฆญ
- "๋ณด์ ์ฐ๊ฒฐ" ๋๋ "์ด ์น์ฌ์ดํธ๋ ์ธ์ฆ๋์์ต๋๋ค" ํ์ ํ์ธ
- ์ธ์ฆ์ ๋ฐ๊ธ ๊ธฐ๊ด(CA) ํ์ธ (์: DigiCert, Let's Encrypt)
๐ 4. HTTPS๊ฐ ํ์ํ ์ด์
๐ HTTPS๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฐ์ํ ์ ์๋ ๋ณด์ ๋ฌธ์ 1๏ธโฃ ํจํท ์ค๋ํ(Packet Sniffing) → ๋ก๊ทธ์ธ ์ ๋ณด, ์ ์ฉ์นด๋ ์ ๋ณด ํ์ทจ ๊ฐ๋ฅ
2๏ธโฃ MITM(Man-In-The-Middle) ๊ณต๊ฒฉ → ์ค๊ฐ์์ ๋ฐ์ดํฐ ๋ณ์กฐ ๊ฐ๋ฅ
3๏ธโฃ ํผ์ฑ(Phishing) ๊ณต๊ฒฉ → ๊ฐ์ง ์ฌ์ดํธ๋ก ์ ๋ ๊ฐ๋ฅ
๐ก ํนํ JWT ๊ธฐ๋ฐ ์ธ์ฆ์์๋ HTTPS๊ฐ ํ์!
- JWT๊ฐ ํค๋์ ํฌํจ๋์ด ์ ์ก๋๋ฏ๋ก, HTTPS๊ฐ ์์ผ๋ฉด ํ ํฐ์ด ํ์ทจ๋ ์ํ์ด ํผ.
- HTTP๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๊ฐ ๋คํธ์ํฌ์์ ํจํท์ ๊ฐ๋ก์ฑ JWT๋ฅผ ํ์น ์ ์์.
- HTTPS๋ฅผ ์ฌ์ฉํ๋ฉด JWT๊ฐ ์ํธํ๋์ด ๊ณต๊ฒฉ์๊ฐ ํ์ทจํด๋ ๋ด์ฉ์ ์ ์ ์์.
๐ 5. ๊ฒฐ๋ก
๐น HTTPS์ ์ญํ ์์ฝ
โ ๋ฐ์ดํฐ ์ํธํ → ๋คํธ์ํฌ์์ ํจํท์ ๊ฐ๋ก์ฑ๋ ๋ด์ฉ์ ๋ณผ ์ ์์.
โ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ → ์ ์ก ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ณ์กฐ๋์ง ์์.
โ ์๋ฒ ์ธ์ฆ → ์ฌ์ฉ์๊ฐ ์ ๋ขฐํ ์ ์๋ ์๋ฒ์ ์ ์ํ๋๋ก ๋ณด์ฅ.
๐น HTTPS๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
โ
๋ก๊ทธ์ธ ์์คํ
(JWT ์ธ์ฆ, OAuth 2.0 ๋ฑ)
โ
์ ์ฉ์นด๋ ๊ฒฐ์ , ๊ฐ์ธ์ ๋ณด ์
๋ ฅ์ด ํ์ํ ์ฌ์ดํธ
โ
API ํต์ (ํ๋ก ํธ์๋ ↔ ๋ฐฑ์๋)
๐ 6. ์ถ๊ฐ ์ง๋ฌธ: "HTTPS๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒฝํ ๋ณด์์ธ๊ฐ?"
โ ์๋๋ค. HTTPS๋ ๋ฐ์ดํฐ ์ ์ก ๊ตฌ๊ฐ์ ๋ณดํธํ ๋ฟ, ์๋ฒ ๋ด๋ถ ๋ณด์๊น์ง ์ฑ
์์ง์ง๋ ์๋๋ค.
์๋ฅผ ๋ค์ด:
- XSS(Cross-Site Scripting) ๊ณต๊ฒฉ → ์น์ฌ์ดํธ์ ์ ์ฑ JavaScript๊ฐ ์ฝ์ ๋ ์๋ ์์.
- SQL Injection → ์๋ฒ์ DB๊ฐ ์์ ํ์ง ์์ผ๋ฉด ๊ณต๊ฒฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์์.
๐ ๋ฐ๋ผ์, HTTPS ์ธ์๋ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ผ์ผ ํ๋ค.
- JWT๋ฅผ HttpOnly ์ฟ ํค์ ์ ์ฅ (XSS ๋ฐฉ์ง)
- JWT ๋ง๋ฃ ์๊ฐ ์งง๊ฒ ์ค์
- ๊ฐ๋ ฅํ ๋น๋ฐ๋ฒํธ ํด์ฑ ์ฌ์ฉ (BCrypt ๋ฑ)
- SQL Injection ๋ฐฉ์ด (Prepared Statement ์ฌ์ฉ)
โ ๊ฒฐ๋ก : HTTPS๋ ํ์๋ค!
1๏ธโฃ HTTP๋ ๋ฐ์ดํฐ๊ฐ ํ๋ฌธ์ผ๋ก ์ ์ก๋๋ฏ๋ก ๋งค์ฐ ์ํ
2๏ธโฃ HTTPS๋ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ฌ ํ์ทจ ๋ฐ ๋ณ์กฐ๋ฅผ ๋ฐฉ์ง
3๏ธโฃ JWT ๊ฐ์ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์์๋ HTTPS ์์ด๋ ๋ณด์์ด ์ทจ์ฝ
4๏ธโฃ HTTPS๋ฅผ ์ฌ์ฉํ๋๋ผ๋, ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๊ฐ ํ์
์ฆ, JWT, ๋ก๊ทธ์ธ, ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ์ํด HTTPS๋ ์ ํ์ด ์๋๋ผ ํ์๋ค! ๐
-------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- ------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------- -------------
๐ CSRF๋ฅผ ๋นํ์ฑํํ๋๋ฐ, JWT๋ ์์ ํ๊ฐ?
CSRF(Cross-Site Request Forgery) ๋ณดํธ๋ฅผ ๋นํ์ฑํํ๋๋ฐ JWT๋ ์์ ํ๊ฐ? ํ๋ ์ง๋ฌธ์ด ๋์ฌ ์ ์๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด, CSRF์ JWT๋ ๋ณด์ ๋ชฉ์ ์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, JWT๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ CSRF ๋ณดํธ๊ฐ ํ์ ์๋ค.
ํ์ง๋ง, JWT๊ฐ ํ์ทจ๋์์ ๋์ ๋ณด์ ๋ฌธ์ ๋ ๋ณ๊ฐ๋ก ์กด์ฌํ๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์กฐ์น๋ฅผ ํด์ผ ํ๋ค.
๐ 1. CSRF๊ฐ ํ๋ ์ญํ
CSRF๋ ์ฌ์ฉ์์ ์ธ์ ์ ์ ์ฉํ์ฌ ์ ์์ ์ธ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ณต๊ฒฉ์ ๋ง๊ธฐ ์ํ ๋ณด์ ๊ธฐ๋ฅ์ด๋ค.
๐ก CSRF ๊ณต๊ฒฉ ์์
1๏ธโฃ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ธ์
์ฟ ํค์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์ ์ฅ๋จ
2๏ธโฃ ์ฌ์ฉ์๊ฐ ๊ณต๊ฒฉ์๊ฐ ๋ง๋ ์
์ฑ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํจ
3๏ธโฃ ์
์ฑ ์ฌ์ดํธ์์ fetch("https://example.com/user/delete", { method: "POST" }) ๊ฐ์ ์์ฒญ์ ์คํ
4๏ธโฃ ๋ธ๋ผ์ฐ์ ๋ ์๋์ผ๋ก ์ธ์
์ฟ ํค๋ฅผ ํฌํจํ์ฌ ์์ฒญ์ ๋ณด๋ → ์ฌ์ฉ์๊ฐ ์๋์น ์๊ฒ ๋ฐ์ดํฐ ์ญ์ ๋จ
โ CSRF ํ ํฐ์ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์ ๋, ์ด ์์ฒญ์ด ์ง์ง ์ฌ์ฉ์์ ์์ฒญ์ธ์ง ํ์ธํ ์ ์๋ค.
๐ 2. JWT ์ฌ์ฉ ์ CSRF๊ฐ ํ์ ์๋ ์ด์
โ
JWT๋ ์ธ์
์ ์ฌ์ฉํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ง์ HTTP ํค๋์ ํ ํฐ์ ํฌํจํ์ฌ ๋ณด๋.
โ
๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก JWT๋ฅผ ํฌํจํ์ง ์์ → CSRF ๊ณต๊ฒฉ์ด ๋ถ๊ฐ๋ฅ.
โ
์ฆ, JWT ๊ธฐ๋ฐ ์ธ์ฆ์ ์ฌ์ฉํ ๋๋ CSRF ๋ณดํธ๊ฐ ํ์ํ์ง ์๋ค.
๐ก CSRF ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ ์ด์ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ์ฟ ํค๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ธ๋ฐ,
JWT๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋๋ ์ธ์
์คํ ๋ฆฌ์ง์ ์ ์ฅ ํ, ์ง์ Authorization ํค๋์ ํฌํจํ์ฌ ์์ฒญ์ ๋ณด๋ด๋ฏ๋ก CSRF ๊ณต๊ฒฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
→ CSRF ๊ณต๊ฒฉ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ์ธ์ ์ฟ ํค๋ฅผ ํฌํจํ๋ ๋ฐฉ์์์ ๋ฐ์ํ๋๋ฐ, JWT๋ ์๋์ผ๋ก ํค๋์ ์ถ๊ฐํ๋ฏ๋ก ํด๋น๋์ง ์๋๋ค.
๐ 3. JWT๊ฐ ํ์ทจ๋๋ฉด ์ด๋ป๊ฒ ๋๋๊ฐ?
JWT๋ ํค๋์์ ํ์ทจ๋ ๊ฒฝ์ฐ ๊ณต๊ฒฉ์๊ฐ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๋ณด์ ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ค.
์ด๋ CSRF ๋ฌธ์ ์๋ ๋ณ๊ฐ์ด๋ฉฐ, ํ ํฐ ํ์ทจ(TOKEN THEFT) ๋ฌธ์ ์ ํด๋นํ๋ค.
๐จ ๊ณต๊ฒฉ์๊ฐ JWT๋ฅผ ํ์ทจํ๋ ๋ฐฉ๋ฒ 1๏ธโฃ Man-in-the-Middle (MITM) ๊ณต๊ฒฉ
- HTTPS๊ฐ ์๋ HTTP๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋คํธ์ํฌ์์ JWT๊ฐ ํ์ทจ๋ ์ ์๋ค.
2๏ธโฃ XSS (Cross-Site Scripting) ๊ณต๊ฒฉ - JWT๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ ๊ฒฝ์ฐ, XSS ์ทจ์ฝ์ ์ด ์๋ ์ฌ์ดํธ์์ ๊ณต๊ฒฉ์๊ฐ JavaScript๋ฅผ ์คํํด ํ ํฐ์ ํ์ทจํ ์ ์๋ค.
3๏ธโฃ ํ ํฐ์ ๋๋ฌด ์ค๋ ์ ์งํ ๊ฒฝ์ฐ - JWT๊ฐ ํ์ทจ๋๋ฉด ์ธ์ ์ฒ๋ผ ๋ฌดํจํํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์, ๋ง๋ฃ ์๊ฐ์ด ๊ธธ ๊ฒฝ์ฐ ์ํํ๋ค.
๐ 4. JWT ํ์ทจ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ
โ 1) HTTPS ์ฌ์ฉ (ํ์)
JWT๋ ํค๋์ ํฌํจํ์ฌ ์ ์ก๋๋ฏ๋ก, ๋คํธ์ํฌ์์ ํ์ทจ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ๋ฐ๋์ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
.requiresChannel(channel -> channel.anyRequest().requiresSecure()) // ๋ชจ๋ ์์ฒญ์ HTTPS๋ก ๊ฐ์
.build();
}
๐จ HTTP๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณต๊ฒฉ์๊ฐ JWT๋ฅผ ํ์ทจํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์์ง๋ค.
โ 2) JWT๋ฅผ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ๋์ HttpOnly ์ฟ ํค์ ์ ์ฅ
XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด, JWT๋ฅผ localStorage๊ฐ ์๋ HttpOnly ์ฟ ํค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- HttpOnly → JavaScript๋ก ์ ๊ทผํ ์ ์์ (XSS ๋ฐฉ์ด)
- Secure → HTTPS์์๋ง ์ ์ก
๐ ์ด๋ ๊ฒ ํ๋ฉด XSS ๊ณต๊ฒฉ์ผ๋ก JavaScript๊ฐ JWT๋ฅผ ์ฝ์ด๊ฐ์ง ๋ชปํจ.
โ 3) ์งง์ JWT ๋ง๋ฃ ์๊ฐ + Refresh Token ์ฌ์ฉ
JWT๊ฐ ํ์ทจ๋ ๊ฒฝ์ฐ, ๋ฌดํจํํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋ง๋ฃ ์๊ฐ์ ์งง๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ข๋ค.
- ์งง์ ๋ง๋ฃ ์๊ฐ (15๋ถ ์ดํ) → ํ ํฐ์ด ํ์ทจ๋๋๋ผ๋ ์ค๋ ์ฌ์ฉํ ์ ์์
- Refresh Token ์ฌ์ฉ → ๋ง๋ฃ๋๋ฉด ์ฌ๋ฐ๊ธ
โ 4) ๋ก๊ทธ์์ ์ ์๋ฒ์์ ๋ธ๋๋ฆฌ์คํธ ๊ด๋ฆฌ
JWT๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ก๊ทธ์์ ๊ธฐ๋ฅ์ด ์์, ํ์ง๋ง ์๋ฒ์์ ๋ธ๋๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ฉด ๊ฐ๋ฅํ๋ค.
public void logout(String token) {
tokenBlacklist.add(token);
}
public boolean isTokenBlacklisted(String token) {
return tokenBlacklist.contains(token);
}
→ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ๋ฉด ํด๋น JWT๋ฅผ ์๋ฒ์์ ๋ฌดํจํํ์ฌ ๋ ์ด์ ์ฌ์ฉํ ์ ์๋๋ก ํจ.
๐ 5. ๊ฒฐ๋ก
Q. CSRF ๋ณดํธ๋ฅผ ๋นํ์ฑํํ๋๋ฐ ๋ณด์ ๋ฌธ์ ๋ ์๋๊ฐ?
→ JWT๋ ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ฆ์ด ์๋๋ผ CSRF ๊ณต๊ฒฉ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ CSRF ๋ณดํธ๊ฐ ํ์ ์๋ค.
Q. ํ์ง๋ง JWT๋ฅผ ํค๋์์ ํ์ทจํ ๊ฐ๋ฅ์ฑ์ ์๋๊ฐ?
→ ๋ง๋ค. JWT ํ์ทจ(TOKEN THEFT)๋ ๋ค๋ฅธ ๋ณด์ ๋ฌธ์ ์ด๋ฉฐ, ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด HTTPS, HttpOnly ์ฟ ํค, ์งง์ ๋ง๋ฃ ์๊ฐ, Refresh Token ๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.
๐ ๊ฒฐ๋ก : CSRF๋ ๋นํ์ฑํํด๋ ๋์ง๋ง, JWT ํ์ทจ๋ฅผ ๋ฐฉ์งํ๋ ์ถ๊ฐ ์กฐ์น๋ฅผ ํด์ผ ํ๋ค.
โ
CSRF ๊ณต๊ฒฉ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์
์ฟ ํค๋ฅผ ์๋์ผ๋ก ํฌํจํ๋ ๋ฐฉ์์์ ๋ฐ์ํ๋ ๋ฌธ์ → JWT๋ ํด๋น๋์ง ์์
โ
ํ์ง๋ง JWT๊ฐ ํ์ทจ๋ ๊ฒฝ์ฐ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ์ ์ธ ๋ณด์ ์กฐ์น๊ฐ ํ์
โ
HTTPS, HttpOnly ์ฟ ํค, ์งง์ ๋ง๋ฃ ์๊ฐ, Refresh Token ๋ฑ์ ํ์ฉํด์ผ ํจ
์ฆ, JWT๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด CSRF๊ฐ ์๋๋ผ "ํ ํฐ ํ์ทจ"์ ๋ํ ๋๋น๊ฐ ์ค์ํ๋ค! ๐