๐Ÿ›ก๏ธ CSRF(Cross-Site Request Forgery): ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ๋‹นํ•˜๋Š” ๊ณต๊ฒฉ?! ๐Ÿค”

์„ํ˜„ยท2025๋…„ 1์›” 27์ผ
0

Insight

๋ชฉ๋ก ๋ณด๊ธฐ
12/43
post-thumbnail

์™œ ๊ฐ‘์ž๊ธฐ CSRF ์ด์•ผ๊ธฐ๋ฅผ ๊บผ๋‚ผ๊นŒ?

์˜ค๋Š˜์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ๋ฌธ๋“ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
"๋‚ด๊ฐ€ ๋งŒ๋“  ์„œ๋น„์Šค๋Š” ์•ˆ์ „ํ•œ๊ฐ€?"
์ด ์งˆ๋ฌธ์„ ์‹œ์ž‘์œผ๋กœ ๋ณด์•ˆ ๊ด€๋ จ ๋‚ด์šฉ์„ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ CSRF(Cross-Site Request Forgery)๋ผ๋Š” ์šฉ์–ด๋ฅผ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์‹ค CSRF๋Š” ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž ๋•Œ๋Š” ์ž˜ ์™€๋‹ฟ์ง€ ์•Š์ง€๋งŒ, ์‹ค๋ฌด์—์„œ๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ๋ณด์•ˆ ์ด์Šˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— CSRF๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


CSRF๋ž€? ๐Ÿค”

CSRF(Cross-Site Request Forgery)๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•Œ์ง€ ๋ชปํ•˜๋Š” ์‚ฌ์ด์—, ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๊ฐ•์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์ฃ . ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋Š” ๊ธˆ์ „ ๊ฑฐ๋ž˜, ๊ณ„์ • ๋ณ€๊ฒฝ, ๋ฏผ๊ฐ ์ •๋ณด ๋…ธ์ถœ ๋“ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSRF ๊ณต๊ฒฉ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๐Ÿ› ๏ธ

  1. ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์˜์ ์ธ ์š”์ฒญ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณต๊ฒฉ์ž๋Š” ์‚ฌ์šฉ์ž์˜ ์€ํ–‰ ๊ณ„์ขŒ์—์„œ ๋ˆ์„ ์ด์ฒดํ•˜๋Š” ์š”์ฒญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

  3. ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    ํ”ผํ•ด์ž๊ฐ€ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ๋ผ๋ฉด, ๊ณต๊ฒฉ์ž์˜ ์š”์ฒญ์€ ํ”ผํ•ด์ž์˜ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


CSRF ๊ณต๊ฒฉ ์˜ˆ์‹œ ๐Ÿ’ฅ

์•„๋ž˜๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ๋งŒ๋“  ์•…์˜์ ์ธ HTML ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋œ ์ƒํƒœ์—์„œ ์‹คํ–‰๋  ๊ฒฝ์šฐ, ํ”ผํ•ด์ž์˜ ์€ํ–‰ ๊ณ„์ขŒ์—์„œ ๊ณต๊ฒฉ์ž์˜ ๊ณ„์ขŒ๋กœ ๋ˆ์„ ์ด์ฒดํ•ฉ๋‹ˆ๋‹ค.

<img src="http://bank.com/transfer?account=attacker&amount=1000" width="0" height="0" />

์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ?

  1. ํ”ผํ•ด์ž๋Š” bank.com์— ๋กœ๊ทธ์ธ๋˜์–ด ์ฟ ํ‚ค์— ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ”ผํ•ด์ž๊ฐ€ ์ด ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•œ ์ด๋ฉ”์ผ์„ ์—ด๊ฑฐ๋‚˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋™์œผ๋กœ src URL์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  3. ์š”์ฒญ์ด ์‹คํ–‰๋˜๋ฉด์„œ ํ”ผํ•ด์ž์˜ ๊ถŒํ•œ์œผ๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…(์—ฌ๊ธฐ์„œ๋Š” ๊ธˆ์ „ ์ด์ฒด)์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


CSRF ๋ฐฉ์–ด ๋ฐฉ๋ฒ• ๐Ÿ›ก๏ธ

1. CSRF ํ† ํฐ ์‚ฌ์šฉ

CSRF ๋ฐฉ์–ด์—์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ CSRF ํ† ํฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋œ ๊ณ ์œ  ํ† ํฐ์„ ํฌํ•จ์‹œํ‚ค๊ณ , ์ด๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ (Java)

// ์„œ๋ฒ„์—์„œ CSRF ํ† ํฐ ์ƒ์„ฑ
String csrfToken = UUID.randomUUID().toString();
session.setAttribute("CSRF_TOKEN", csrfToken);

// HTML ํผ์— CSRF ํ† ํฐ ํฌํ•จ
<form action="/transfer" method="POST">
    <input type="hidden" name="csrf_token" value="${csrfToken}" />
    <input type="text" name="account" placeholder="Recipient Account" />
    <input type="number" name="amount" placeholder="Amount" />
    <button type="submit">Transfer</button>
</form>

// ์„œ๋ฒ„์—์„œ CSRF ํ† ํฐ ๊ฒ€์ฆ
String tokenFromRequest = request.getParameter("csrf_token");
String tokenFromSession = session.getAttribute("CSRF_TOKEN");

if (!tokenFromSession.equals(tokenFromRequest)) {
    throw new SecurityException("Invalid CSRF token");
}

[์ด๋ฏธ์ง€ ์‚ฝ์ž…]

CSRF ํ† ํฐ์„ ์„ค๋ช…ํ•˜๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ (๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ: "CSRF token flow diagram")

2. SameSite ์ฟ ํ‚ค ์„ค์ •

์ฟ ํ‚ค์— SameSite ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์‹œ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์„ค์ •์€ CSRF๋ฅผ ๋ฐฉ์–ดํ•˜๋Š” ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ (HTTP ํ—ค๋” ์„ค์ •)

Set-Cookie: sessionId=abc123; SameSite=Strict

3. Referer ํ—ค๋” ๊ฒ€์ฆ

์š”์ฒญ ํ—ค๋”์˜ Referer ๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ์š”์ฒญ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ถœ์ฒ˜์—์„œ ์™”๋Š”์ง€๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ, ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๋‚˜ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋Š” Referer๊ฐ€ ๋น„์›Œ์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋ณด์กฐ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

4. CAPTCHA ์‚ฌ์šฉ

์ค‘์š”ํ•œ ์š”์ฒญ(์˜ˆ: ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ๊ธˆ์ „ ์ด์ฒด ๋“ฑ)์—๋Š” CAPTCHA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์š”์ฒญ์„ ์˜๋„ํ•œ ๊ฒƒ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


CSRF์™€ XSS์˜ ์ฐจ์ด์ ์€? ๐Ÿค”

CSRF์™€ XSS(Cross-Site Scripting)๋Š” ์ข…์ข… ํ˜ผ๋™๋˜์ง€๋งŒ, ๊ทธ ์ž‘๋™ ๋ฐฉ์‹์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค:

  • CSRF๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ ๋ขฐํ•˜๋Š” ์‚ฌ์ดํŠธ์— ๋Œ€ํ•ด ๊ณต๊ฒฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ.
  • XSS๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์‹ ๋ขฐ๋ฐ›๋Š” ์‚ฌ์ดํŠธ์— ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ.
๊ณต๊ฒฉ ์œ ํ˜•์ฃผ์š” ๋ชฉํ‘œ์‚ฌ์šฉ์ž ๊ฐœ์ž… ํ•„์š”์„ฑ
CSRF๊ถŒํ•œ ํƒˆ์ทจ ๋ฐ ์š”์ฒญ ์กฐ์ž‘ํ•„์š”ํ•จ
XSS์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ํ•„์š” ์—†์Œ

[์ด๋ฏธ์ง€ ์‚ฝ์ž…]

CSRF์™€ XSS์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜๋Š” ํ‘œ๋‚˜ ๋‹ค์ด์–ด๊ทธ๋žจ (๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ: "CSRF vs XSS")


๊ฒฐ๋ก  ๐ŸŒŸ

CSRF๋Š” ๊ฐ„๋‹จํ•œ ๊ณต๊ฒฉ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๊ทธ ์˜ํ–ฅ์€ ์‹ฌ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ ์ ˆํ•œ ๋ฐฉ์–ด ์ „๋žต(์˜ˆ: CSRF ํ† ํฐ, SameSite ์ฟ ํ‚ค ๋“ฑ)์„ ์ ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ณต๊ฒฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„๋„ ํ”„๋กœ์ ํŠธ์—์„œ CSRF ๋ฐฉ์–ด๋ฅผ ์ฒ ์ €ํžˆ ์ ์šฉํ•ด, ๋”์šฑ ์•ˆ์ „ํ•œ ์›น ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”! ๐Ÿš€


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