๐ŸŒฟSpring

[Spring Security] ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ #1: CSRF๊ณต๊ฒฉ๊ณผ XSS ๊ณต๊ฒฉ + ๋Œ€์‘ ์ „๋žต

์†Œ์˜ ๐Ÿ€ 2025. 5. 23. 16:42

 

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” 4๊ฐ€์ง€ ์ฃผ์š” ๋ณด์•ˆ ๊ณต๊ฒฉ

: CSRF ๊ณต๊ฒฉ, XSS ๊ณต๊ฒฉ, ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ, JWT ํƒˆ์ทจ ๊ณต๊ฒฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ,

์ด๋ฅผ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋Š” Spring Security ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋Œ€์‘ ์ „๋žต์„ ์‚ดํŽด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

๊ธ€์ด ๊ธธ์–ด์ ธ์„œ ๋‘ ํŽธ์— ๋‚˜๋ˆ„์–ด ์”๋‹ˆ๋‹ค.


๐Ÿ“Œ CSRF ๊ณต๊ฒฉ

CSRF๋Š” Cross-Stie Request Forgery์˜ ์ค„์ž„๋ง๋กœ "์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„๋ฅผ ํŠน์ •ํ•œ ์›น ์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

 

CSRF ๊ณต๊ฒฉ์ด ์„ฑ๊ณตํ•˜๋ ค๋ฉด 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๋Š” ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ํ•ด์ปค(๊ณต๊ฒฉ์ž)๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค์—์„œ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•ด์ปค(๊ณต๊ฒฉ์ž) ๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•(API, ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ )์„ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋ณผ๊นŒ์š”? ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ด ์ „์ œ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.

  • ํ”ผํ•ด์ž๋Š” ์€ํ–‰ ์‚ฌ์ดํŠธ(bank.com)์— ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • ์€ํ–‰ ์‚ฌ์šฉ์ž๋Š” POST /transfer ์š”์ฒญ์œผ๋กœ ์„œ๋ฒ„์— ์†ก๊ธˆ์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด์ปค๋Š” ์ด๊ฒƒ์„ ์•Œ๊ณ  ํ”ผํ•ด์ž ๊ณ„์ •์—์„œ ์ž์‹ ์˜ ๊ณ„์ขŒ๋กœ ๋ˆ์„ ๋นผ๋‚ด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

๐ŸฅŠ ํ•ด์ปค๋Š” ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<html>
  <body onload="document.forms[0].submit()">
    <form action="https://bank.com/transfer" method="POST">
      <input type="hidden" name="toAccount" value="hacker-account" />
      <input type="hidden" name="amount" value="1000000" />
    </form>
  </body>
</html>

 

  1. ํ•ด์ปค๋Š” ์ž์‹ ์˜ ๋ธ”๋กœ๊ทธ๋‚˜ ์•…์„ฑ ์‚ฌ์ดํŠธ์— ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ˆจ๊ฒจ ๋‘ก๋‹ˆ๋‹ค. 
  2. ํ•ด์ปค๋Š” ์ด ์‚ฌ์ดํŠธ๋ฅผ ํ”ผํ•ด์ž์—๊ฒŒ ์ด๋ฉ”์ผ์ด๋‚˜ ๊ด‘๊ณ  ๋“ฑ์„ ํ†ตํ•ด ์ „๋‹ฌํ•˜๊ณ , ํ”ผํ•ด์ž๊ฐ€ ์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. ํ”ผํ•ด์ž๊ฐ€ bank.com์— ์ด๋ฏธ ๋กœ๊ทธ์ธ ๋˜์–ด ์žˆ๋˜ ์ƒํƒœ์—์„œ ํ•ด์ปค ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด ์œ„ ํผ์ด ์ž๋™์œผ๋กœ ์ œ์ถœ๋˜๋ฉฐ bank.com์œผ๋กœ ์š”์ฒญ์ด ๊ฐ‘๋‹ˆ๋‹ค.
  4. bank.com์œผ๋กœ ํ•ด์ปค์˜ ๊ณ„์ขŒ(hacker-account)๋กœ 1000000์› ์†ก๊ธˆํ•˜๋ผ๋Š” POST /transfer ์š”์ฒญ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ”ผํ•ด์ž์˜ ์„ธ์…˜ ์ฟ ํ‚ค๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • ์™œ ์„ธ์…˜ ์ฟ ํ‚ค๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จ๋ ๊นŒ์š”? HTTP ์ฟ ํ‚ค๋Š” ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด ์ €์žฅ๋˜๊ณ ,
      ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋„๋ฉ”์ธ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์ฟ ํ‚ค์˜ ์ถœ์ฒ˜์™€ ์ƒ๊ด€ ์—†์ด ๊ทธ ๋„๋ฉ”์ธ์— ์„ค์ •๋œ ์ฟ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ์ฒจ๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • bank.com์—์„œ ๋กœ๊ทธ์ธํ•ด์„œ ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , bank.com์œผ๋กœ ์†ก๊ธˆ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋‹ˆ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด์ „์— bank.com์—์„œ ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ํ•จ๊ป˜ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  5. bank.com ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ฟ ํ‚ค๊ฐ€ ๋‹ด๊ฒจ์žˆ์œผ๋‹ˆ ์ ํ•ฉํ•œ ์š”์ฒญ์ด๋ผ ํŒ๋‹จํ•˜๊ณ , ์†ก๊ธˆ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’‰๋Œ€์‘ ์ „๋žต

โœ… CSRF ํ† ํฐ ์‚ฌ์šฉ

Spring์—์„œ๋Š” Spring Security์—์„œ CSRF ๋ณดํ˜ธ ์„ค์ •์„ ํ•˜์—ฌ ์ด ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์„ค์ •์€ ์‚ฌ์šฉ์ž ์„ธ์…˜์— ์ž„์˜์˜ ๊ฐ’, CSRF ํ† ํฐ์„ ์ €์žฅํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ’์„ ํฌํ•จํ•˜์—ฌ ์ „์†ก๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์—์„œ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ์„ธ์…˜์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

 

Spring Security์˜ CSRF ๋ณดํ˜ธ ํ๋ฆ„

  • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ฒซ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ CsrfFilter๊ฐ€ ๋™์ž‘ 
  • ๋žœ๋คํ•œ ๊ฐ’์˜ CsrfToken์„ ์ƒ์„ฑํ•˜์—ฌ ์„ธ์…˜์— ์ €์žฅ
  • ์‚ฌ์šฉ์ž์—๊ฒŒ CsrfToken์„ ๋ณด๋ƒ„. ์•„๋ž˜ ๋‘ ๊ฐ’์ด ์ „์†ก๋จ
    • ${_csrf.token} → HTML ํผ์œผ๋กœ hidden ํ•„๋“œ๋กœ ํฌํ•จ
    • javascript๋ฅผ ํ†ตํ•ด X-CSRF-TOKEN ํ—ค๋”๋กœ ์„ค์ •
  • ์ดํ›„ ์‚ฌ์šฉ์ž๊ฐ€ POST, PUT, DELETE ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด CsrfFilter๊ฐ€ ํ† ํฐ์„ ์„ธ์…˜์— ์ €์žฅ๋œ ๊ฐ’๊ณผ ํ™•์ธ
    • GET ๋“ฑ์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋Š” ์•ˆ์ „ํ•œ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๊ฒ€์ฆ ์ œ์™ธ
  • ๋ถˆ์ผ์น˜ ์‹œ 403 Forbidden ์‘๋‹ต

โœ… Referer Check(๋ฆฌํผ๋Ÿฌ ์ฒดํฌ)

Referer๋Š” HTTP ์š”์ฒญ ํ—ค๋” ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์žฆ๊ฐ€ ์–ด๋–ค ์‚ฌ์ดํŠธ์—์„œ ์ด ์š”์ฒญ์„ ๋ณด๋ƒˆ๋Š”์ง€ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด์ปค์˜ ๊ณต๊ฒฉ ์‚ฌ์ดํŠธ์ธ attack.com์—์„œ ์€ํ–‰ ์‚ฌ์ดํŠธ์ธ bank.com์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค๋ฉด

์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

POST /transfer 
Host: http://bank.com
Referer: http://attack.com

 

์„œ๋ฒ„์—์„œ๋Š” Rererer ํ—ค๋”๋ฅผ ํ™•์ธํ•œ ํ›„ ํ˜ธ์ŠคํŠธ์™€ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด

๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์˜จ ์š”์ฒญ์ด๋ฏ€๋กœ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ ๋งŽ์€ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ XSS ๊ณต๊ฒฉ

XSS๋Š” Cross-Site Scripting์œผ๋กœ 

๊ด€๋ฆฌ์ž๊ฐ€ ์•„๋‹Œ, ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์‚ฌ์ดํŠธ์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

 

๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ 3๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

 

๐ŸฅŠ Reflected XSS (๋ฐ˜์‚ฌํ˜• ํฌ๋กœ์Šค์‚ฌ์ดํŠธ์Šคํฌ๋ฆฝํŠธ)

 

์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋”ฐ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๊ณ , ์‘๋‹ต HTML์— ๊ทธ๋Œ€๋กœ ๋ฐ˜์˜๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋•Œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์—ˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์ค€ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์›นํŽ˜์ด์ง€์— "๋ฐ˜์‚ฌ"๋˜์–ด 

๋ธŒ๋ผ์šฐ์ €์—์„œ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰์ด ๋ฉ๋‹ˆ๋‹ค.

<script> (์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ) </script>

 

๐ŸฅŠ Stored XSS (์ €์žฅํ˜• ํฌ๋กœ์Šค์‚ฌ์ดํŠธ์Šคํฌ๋ฆฝํŠธ)

 

์›น ์„œ๋ฒ„์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

ํ•ด์ปค๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜์—ฌ ๊ฒŒ์‹œํŒ ๋“ฑ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ DB์— ์ €์žฅ๋˜๋Š”๊ฑฐ์ฃ .

์ดํ›„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„์— ์ €์žฅ๋œ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ์ธก์—์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ฆ‰, ํ•ด์ปค๊ฐ€ ํ•œ ๋ฒˆ๋งŒ ์‚ฝ์ž…ํ•ด๋„, ๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ”ผํ•ด์ž๊ฐ€ ์ƒ๊ธฐ๋Š” ์ง€์†์ ์ธ ์œ„ํ—˜ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

 

๐ŸฅŠ DOM Based XSS (DOM ๊ธฐ๋ฐ˜ ํฌ๋กœ์Šค์‚ฌ์ดํŠธ์Šคํฌ๋ฆฝํŠธ)

 

์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„œ๋ฒ„์™€ ์ƒํ˜ธ์ž‘์šฉ ์—†์ด ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด์—์„œ ์‹คํ–‰๋˜๋Š” ์ทจ์•ฝ์ ์œผ๋กœ,

ํŽ˜์ด์ง€์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ์•…์„ฑ ์ฝ”๋“œ๊ฐ€ DOM ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

DOM(Document Object Model, ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ): ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ๋กœ HTML ๋ฐ XML ๋ฌธ์„œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

 

์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฑ์—”๋“œ์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์€ ์•„๋‹™๋‹ˆ๋‹ค.

 

๐Ÿ’‰๋Œ€์‘ ์ „๋žต

โœ… ์ž…๋ ฅ๊ฐ’ ํ•„ํ„ฐ๋ง๊ณผ ์ถœ๋ ฅ ์‹œ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ

์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ค‘ <script>, onload= ์™€ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

์ด๋Ÿฐ ์œ„ํ—˜ํ•œ ๋ฌธ์ž์—ด์€ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ HTML, Javascript ๋“ฑ์— ์ถœ๋ ฅํ•  ๋•Œ ์•ˆ์ „ํ•œ ๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<!-- ์œ„ํ—˜ -->
<div>${userInput}</div>

<!-- ์•ˆ์ „ (Thymeleaf, JSP ๋“ฑ์€ ์ž๋™ ์ด์Šค์ผ€์ดํ”„ ์ง€์›) -->
<div th:text="${userInput}"></div>

 

โœ… Content Security Policy (CSP)

CSP๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‹จ์—์„œ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ œํ•œํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.

"์ด ํŽ˜์ด์ง€์—๋Š” ์ด ๋ฆฌ์†Œ์Šค๋“ค๋งŒ ํ—ˆ์šฉํ•œ๋‹ค"๋ฅผ ์ง€์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

Spring Security์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด CSP๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .headers(headers -> headers
            .contentSecurityPolicy(csp -> csp
                .policyDirectives("default-src 'self'; script-src 'self'")
            )
        );
    return http.build();
}

 

์ด๋Ÿฌ๋ฉด Spring Security๋Š” ์‘๋‹ต ํ—ค๋”์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Content-Security-Policy: default-src 'self'; script-src 'self'

 

  • default-src 'self': ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด ๋„๋ฉ”์ธ(self)์˜ ๋ฆฌ์†Œ์Šค๋งŒ ํ—ˆ์šฉ
  • script-src 'self': ์Šคํฌ๋ฆฝํŠธ๋Š” ์˜ค์ง ๋‚ด ์„œ๋ฒ„(self)์—์„œ ์ œ๊ณต๋˜๋Š” ๊ฒƒ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ
    • ์™ธ๋ถ€ Javascript ํŒŒ์ผ์ด๋‚˜ HTML๋‚ด <script> ํƒœ๊ทธ๊ฐ€ ์ธ๋ผ์ธ์œผ๋กœ ์žˆ์–ด๋„ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์ค‘์š”ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.

self ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • nonce-{๋žœ๋ค๊ฐ’}: ํŠน์ • nonce ๊ฐ’์„ ๊ฐ€์ง„ ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋งŒ ํ—ˆ์šฉ
  • sha256-{ํ•ด์‹œ๊ฐ’}: ํŠน์ • ํ•ด์‹œ์™€ ์ผ์น˜ํ•˜๋Š” ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ๋งŒ ํ—ˆ์šฉ

 


์ฐธ๊ณ ์ž๋ฃŒ

 

 

๋ฐ˜์‘ํ˜•