[TECH-QA] CSRF(Cross-Site Request Forgery)์™€ XSSCross-Site Scripting

CSRF ํ† ํฐ ์ด๋ž€

CSRF ํ† ํฐ์€ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์š”์ฒญ ์œ„์กฐ(Cross-Site Request Forgery, CSRF) ๊ณต๊ฒฉ์„ ๋ฐฉ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ณ ์œ ํ•œ ๋žœ๋ค ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ƒ์„ฑ๋˜์–ด ์‚ฌ์šฉ์ž ์„ธ์…˜๊ณผ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ(์˜ˆ: ํผ ์ œ์ถœ, AJAX ํ˜ธ์ถœ)์„ ๋ณด๋‚ผ ๋•Œ ์ด ํ† ํฐ์„ ํ•จ๊ป˜ ์ „์†กํ•˜์—ฌ ์š”์ฒญ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

CSRF ํ† ํฐ์˜ ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„

๐Ÿ“ ์„œ๋ฒ„์—์„œ CSRF ํ† ํฐ ์ƒ์„ฑ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘์†ํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์‚ฌ์šฉ์ž ์„ธ์…˜์— ๊ณ ์œ ํ•œ CSRF ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ํ† ํฐ์€ ์„œ๋ฒ„์˜ ์„ธ์…˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(์˜ˆ: ์„ธ์…˜ ID์™€ ์—ฐ๊ณ„๋œ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋˜๋Š” ์บ์‹œ).
  • ์„œ๋ฒ„ ์„ธ์…˜์€ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๊ณ ์œ ํ•˜๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ ํด๋ผ์ด์–ธํŠธ๋กœ CSRF ํ† ํฐ ์ „๋‹ฌ

์„œ๋ฒ„๋Š” ์ƒ์„ฑํ•œ CSRF ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ)๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค:
  • HTML ํผ์˜ ์ˆจ๊ฒจ์ง„ ํ•„๋“œ()๋กœ ํฌํ•จ.
  • AJAX ์š”์ฒญ์„ ์œ„ํ•ด HTTP ํ—ค๋”(์˜ˆ: X-CSRF-Token)๋กœ ์ „๋‹ฌ.
  • ์ฟ ํ‚ค๋กœ ์ „์†ก(๋‹จ, ์ฟ ํ‚ค ์ž์ฒด๋Š” CSRF ๋ฐฉ์ง€์— ์ง์ ‘ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ).
ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ํ† ํฐ์„ ๋ฐ›์•„์„œ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ์ €์žฅ์€ ์ฃผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ(์˜ˆ: JavaScript ๋ณ€์ˆ˜)๋‚˜ HTML ํผ์— ์ผ์‹œ์ ์œผ๋กœ ์œ ์ง€๋˜๋ฉฐ, ํ”„๋ก ํŠธ์—”๋“œ์˜ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค(๋ณด์•ˆ์ƒ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ).

๐Ÿ“ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ ์ „์†ก

  • ์‚ฌ์šฉ์ž๊ฐ€ ํผ์„ ์ œ์ถœํ•˜๊ฑฐ๋‚˜ AJAX ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ํด๋ผ์ด์–ธํŠธ๋Š” CSRF ํ† ํฐ์„ ์š”์ฒญ์— ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์˜ˆ: POST ์š”์ฒญ์˜ ๋ฐ”๋””์— _csrf ํ•„๋“œ๋กœ ํฌํ•จ๋˜๊ฑฐ๋‚˜, ํ—ค๋”์— X-CSRF-Token์œผ๋กœ ์ถ”๊ฐ€๋จ.

๐Ÿ“ ์„œ๋ฒ„์—์„œ CSRF ํ† ํฐ ๊ฒ€์ฆ

  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ CSRF ํ† ํฐ์„ ์„œ๋ฒ„ ์„ธ์…˜์— ์ €์žฅ๋œ ํ† ํฐ๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์ด ์ผ์น˜ํ•˜๋ฉด ์š”์ฒญ์ด ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์ด ์ผ์น˜ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—†์œผ๋ฉด ์š”์ฒญ์„ ๊ฑฐ๋ถ€(์˜ˆ: 403 Forbidden ์‘๋‹ต).

๐Ÿ“ ์„ธ์…˜ ์œ ์ง€ ๋ฐ ํ† ํฐ ๊ฐฑ์‹ 

์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ํ›„, ์„œ๋ฒ„๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด CSRF ํ† ํฐ์„ ์ƒ์„ฑํ•˜์—ฌ ์„ธ์…˜์— ์ €์žฅํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ํ† ํฐ์„ ์ผํšŒ์„ฑ ๋˜๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ“ ์˜ˆ์‹œ

<form method="POST" action="/update-profile">
  <span class="point"><input type="hidden" name="_csrf" value="abc123xyz789"></span>
  <input type="text" name="username">
  <button type="submit">์ €์žฅ</button>
</form>

๐Ÿ“ ์˜ˆ์ œ: JavaScript (Fetch API)

<!DOCTYPE html>
<html>
<head>
    <title>CSRF AJAX Example</title>
    <!-- CSRF ํ† ํฐ์„ ๋ฉ”ํƒ€ ํƒœ๊ทธ๋กœ ํฌํ•จ -->
    <meta name="csrf-token" content="3f9a8b2c-7e5d-4a1b-9c0f-1234567890ab">
</head>
<body>
    <button onclick="submitData()">Submit via AJAX</button>

    <script>
        function submitData() {
            // ๋ฉ”ํƒ€ ํƒœ๊ทธ์—์„œ CSRF ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ
            const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

            fetch('/submit', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRF-Token': csrfToken // CSRF ํ† ํฐ์„ ํ—ค๋”์— ์ถ”๊ฐ€
                },
                body: JSON.stringify({ username: 'john' })
            })
            .then(response => response.text())
            .then(data => console.log(data))
            .catch(error => console.error('Error:', error));
        }
    </script>
</body>
</html>
๋Š” ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•œ CSRF ํ† ํฐ์„ ํ”„๋ก ํŠธ์—”๋“œ์— ์ „๋‹ฌํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. JavaScript์—์„œ fetch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, X-CSRF-Token ํ—ค๋”์— ํ† ํฐ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
POST /submit HTTP/1.1
Host: example.com
Content-Type: application/json
X-CSRF-Token: 3f9a8b2c-7e5d-4a1b-9c0f-1234567890ab

๐Ÿ“ HTTP ์š”์ฒญ ํ—ค๋”

POST /submit HTTP/1.1
Host: example.com
Content-Type: application/json
X-CSRF-Token: 3f9a8b2c-7e5d-4a1b-9c0f-1234567890ab

๐Ÿ“ ์š”์ฒญ ๋ฐ”๋””

{"username":"john"}
์„œ๋ฒ„๋Š” _csrf ๊ฐ’์ด ์„ธ์…˜์˜ ํ† ํฐ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ ํ›„ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

CSRF ํ† ํฐ์˜ ์ค‘์š”์„ฑ

  • ๊ณต๊ฒฉ ๋ฐฉ์–ด: ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ฟ ํ‚ค๋ฅผ ์•…์šฉํ•ด ์œ„์กฐ ์š”์ฒญ์„ ๋ณด๋‚ด๋”๋ผ๋„, CSRF ํ† ํฐ์ด ์—†์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„: ๋Œ€๋ถ€๋ถ„์˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ(์˜ˆ: Spring, Django, Laravel)๋Š” CSRF ํ† ํฐ ์ƒ์„ฑ ๋ฐ ๊ฒ€์ฆ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์ถ”๊ฐ€ ๊ณ ๋ ค์‚ฌํ•ญ

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

์ฟ ํ‚ค ์†์„ฑ ์„ค์ •(SameSite)

์ฟ ํ‚ค์— SameSite ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ๋™์ผ ์ถœ์ฒ˜(Same-Origin) ๋˜๋Š” ์ œํ•œ๋œ ์กฐ๊ฑด์—์„œ๋งŒ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • Strict: ๋™์ผ ๋„๋ฉ”์ธ์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ.
  • Lax: ๋™์ผ ๋„๋ฉ”์ธ ์™ธ์˜ GET ์š”์ฒญ(์˜ˆ: ๋งํฌ ์ด๋™)์—์„œ๋งŒ ์ฟ ํ‚ค ์ „์†ก ๊ฐ€๋Šฅ.
  • None: ๋ชจ๋“  ์š”์ฒญ์—์„œ ์ฟ ํ‚ค ์ „์†ก(๋‹จ, HTTPS์™€ Secure ์†์„ฑ ํ•„์ˆ˜)
SameSite=Lax ๋Š” ๋Œ€๋ถ€๋ถ„์˜ CSRF ๋ฐฉ์–ด์— ์ ํ•ฉํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•ด์น˜์ง€ ์•Š์œผ๋ฉด์„œ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค. SameSite=Strict๋Š” ๋” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์™ธ๋ถ€ ๋งํฌ๋ฅผ ํ†ตํ•œ ์ ‘๊ทผ ์‹œ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š์•„ ๊ธฐ๋Šฅ์  ์ œ์•ฝ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP ๋ฉ”์„œ๋“œ ์ œํ•œ: ์ƒํƒœ ๋ณ€๊ฒฝ ์š”์ฒญ(์˜ˆ: ๋ˆ ์ด์ฒด, ๊ณ„์ • ์ˆ˜์ •)์€ POST, PUT, DELETE์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋งŒ ํ—ˆ์šฉํ•˜๊ณ , GET ์š”์ฒญ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์œ ๋ฐœํ•˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • Referer/Origin ํ—ค๋” ๊ฒ€์ฆ: ์š”์ฒญ์˜ ์ถœ์ฒ˜๋ฅผ ํ™•์ธํ•˜์—ฌ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„๋ฉ”์ธ์—์„œ๋งŒ ์š”์ฒญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, Referer ํ—ค๋”๋Š” ๋ธŒ๋ผ์šฐ์ € ์„ค์ •์— ๋”ฐ๋ผ ๋ˆ„๋ฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ณด์กฐ์  ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

XSS ๊ณต๊ฒฉ ์ด๋ž€

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

๐Ÿ“ ์ž…๋ ฅ ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๋ฐ ํŠน์ˆ˜๋ฌธ์ž ์ด์Šค์ผ€์ดํ”„

์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ๋ฐ›์€ ๋ฐ์ดํ„ฐ(์˜ˆ: ํ…์ŠคํŠธ, URL, JSON ๋“ฑ)์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ , HTML, JavaScript, SQL ๋“ฑ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŠน์ˆ˜๋ฌธ์ž( <, >, ", ', & ๋“ฑ)๋ฅผ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ(์˜ˆ: ํ…์ŠคํŠธ ํ•„๋“œ, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ)๋ฅผ ์„œ๋ฒ„ ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ›์œผ๋ฉด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ํฌํ•จ๋œ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์•ˆ์ „ํ•œ ๋ฌธ์ž(์˜ˆ: <)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ HTML, JavaScript ๋“ฑ์˜ ๋ฌธ๋งฅ์—์„œ ์ถœ๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฅผ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ํ…์ŠคํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•จ.
<!-- ์ž…๋ ฅ: <script>alert('XSS')</script> --> 
<!-- ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ ํ›„ ์ถœ๋ ฅ -->
&lt;script&gt;alert(&#39;XSS&#39;)&lt;script&gt;
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์œ„๋ฅผ ๋กœ ํ‘œ์‹œํ•˜๋ฉฐ, ์‹คํ–‰ํ•˜์ง€ ์•Š์Œ.
ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘์—์„œ ์ž…๋ ฅ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ ์„œ๋ฒ„์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ ์ „, ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์œ„ํ•ด ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

๐Ÿ“ CSP(Content Security Policy) ์„ค์ •

์„œ๋ฒ„์—์„œ HTTP ์‘๋‹ต ํ—ค๋”์— CSP๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ—ˆ์šฉ๋œ ์Šคํฌ๋ฆฝํŠธ, ์Šคํƒ€์ผ, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ์ถœ์ฒ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
Content-Security-Policy: script-src 'self' https://trusted.cdn.com;
CSP๋Š” ์ธ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ()๋‚˜ ์™ธ๋ถ€ ์ถœ์ฒ˜์˜ ์•…์„ฑ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. 'strict-dynamic', 'nonce', 'hash'์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CSP ์„ค์ •์€ ์‹ ์ค‘ํžˆ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ธฐ์กด ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ถœ๋ ฅ ์ด์Šค์ผ€์ดํ”„: ๋ฐ์ดํ„ฐ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฌธ๋งฅ(HTML, ์†์„ฑ, JavaScript, CSS, URL ๋“ฑ)์— ๋งž๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: HTML ์†์„ฑ์—๋Š” ๋”๋ธ”์ฟผํ…Œ์ด์…˜(")๋ฅผ &quot;๋กœ ๋ณ€ํ™˜.
  • ์•ˆ์ „ํ•œ API ์‚ฌ์šฉ: innerHTML ๋Œ€์‹  textContent๋‚˜ setAttribute๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟ ํ‚ค ๋ณดํ˜ธ: HttpOnly ์†์„ฑ์„ ์ฟ ํ‚ค์— ์„ค์ •ํ•˜์—ฌ JavaScript์—์„œ ์ฟ ํ‚ค์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์ž„์›Œํฌ ๋ณด์•ˆ: React, Angular ๋“ฑ ํ˜„๋Œ€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ XSS ๋ฐฉ์–ด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, dangerouslySetInnerHTML ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ HTTPS๋ฅผ ํ†ตํ•œ ํ†ต์‹  ๋ณด์•ˆ

HTTP๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ‰๋ฌธ์œผ๋กœ ์ „์†ก๋˜์–ด ๋„์ฒญ ๋ฐ ์กฐ์ž‘์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค. HTTPS๋Š” SSL/TLS๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ HTTPS ์ ์šฉ

HSTS๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ํ•ด๋‹น ์‚ฌ์ดํŠธ๋Š” ํ•ญ์ƒ HTTPS๋กœ๋งŒ ์ ‘์†ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์‹œํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด ํ—ค๋”๋ฅผ ๋ฐ›์œผ๋ฉด, ์ดํ›„์—” ์ž๋™์œผ๋กœ HTTP ์š”์ฒญ์„ HTTPS๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ HSTS ํ—ค๋” ์˜ˆ์‹œ

์„œ๋ฒ„์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ—ค๋”๋ฅผ ์‘๋‹ต์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
Strict-Transport-Security: max-age=31536000; includeSubDomains
HTTPS๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ๊ธฐ๋ฐ€์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, CSRF์™€ XSS ๊ณต๊ฒฉ์—์„œ ์ฟ ํ‚ค๋‚˜ ํ† ํฐ์ด ํƒˆ์ทจ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. HSTS๋Š” ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ(MITM)์„ ์ค„์ด๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ตœ์‹  TLS ๋ฒ„์ „(์˜ˆ: TLS 1.3)๊ณผ ๊ฐ•๋ ฅํ•œ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์ถ”๊ฐ€ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์ธ์ฆ์„œ ๊ด€๋ฆฌ: ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ ๊ธฐ๊ด€(CA)์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ SSL/TLS ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋งŒ๋ฃŒ ์ „์— ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ  ๋ฐฉ์ง€: HTTPS ํŽ˜์ด์ง€์—์„œ HTTP ๋ฆฌ์†Œ์Šค(์ด๋ฏธ์ง€, ์Šคํฌ๋ฆฝํŠธ ๋“ฑ)๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ ๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ข…ํ•ฉ์ ์ธ ๋ณด์•ˆ ์ „๋žต

CSRF์™€ XSS ๋ฐฉ์–ด๋Š” ๋‹จ์ผ ๊ธฐ๋ฒ•์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๋ฐฉ์–ด ๊ณ„์ธต์„ ์กฐํ•ฉํ•˜์—ฌ ์ ์šฉํ•˜๋Š” ์‹ฌ์ธต ๋ฐฉ์–ด(Defense-in-Depth) ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ๋‹จ๊ณ„: ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๋ณด์•ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ, OWASP ๊ฐ€์ด๋“œ๋ผ์ธ ์ค€์ˆ˜.
  • ๋ฐฐํฌ ๋‹จ๊ณ„: ๋ณด์•ˆ ํ—ค๋” ์„ค์ •(CSP, HSTS, X-Frame-Options ๋“ฑ), ์ทจ์•ฝ์  ์Šค์บ”.
  • ์šด์˜ ๋‹จ๊ณ„: ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง, WAF(Web Application Firewall) ๋„์ž…, ์ •๊ธฐ์ ์ธ ๋ณด์•ˆ ํŒจ์น˜.