2025. 8. 13. 14:00ㆍ프로그램/PHP 중급
📚 PHP 중급 - 8주차: 웹 보안 기초 및 에러 핸들링- 01 XSS, CSRF 공격 이해 및 방어

웹 애플리케이션을 만들 때 기능 구현만큼 중요한 것이 바로 #보안입니다. 사용자의 #데이터를 보호하고, #서비스의 #무결성을 지키기 위해 기본적인 #웹보안 지식을 갖추는 것은 필수적입니다. 이번 포스팅에서는 웹에서 자주 발생하는 #XSS와 #CSRF 공격의 원리를 이해하고, 이를 방어하기 위한 #PHP 코딩 방법을 알아보겠습니다.
#1 XSS (Cross-Site Scripting) 공격 이해와 방어

XSS는 공격자가 #게시판이나 #댓글 등에 악의적인 #스크립트를 삽입하여 다른 사용자의 웹 브라우저에서 실행되도록 유도하는 공격입니다. 이 스크립트는 사용자의 #쿠키나 #세션 정보를 탈취하거나, 웹 페이지의 내용을 변조하는 등 심각한 피해를 일으킬 수 있습니다.
방어 방법: 입력 값 검증 및 출력 시 이스케이프 처리
가장 효과적인 방어책은 사용자로부터 입력받은 모든 #데이터를 신뢰하지 않고, 반드시 검증하고 #이스케이프 처리하는 것입니다. PHP에서는 htmlspecialchars() 함수를 사용하여 HTML 엔티티를 변환함으로써 스크립트가 실행되지 않도록 방지할 수 있습니다.
<?php
// 사용자 입력 값
$user_input = "<script>alert('XSS 공격!');</script>";
// htmlspecialchars() 함수를 사용하여 특수 문자를 HTML 엔티티로 변환
$safe_output = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// 출력 결과: <script>alert('XSS 공격!');</script>가 그대로 출력됨
echo $safe_output;
?>
htmlspecialchars() 함수는 < > & " '와 같은 특수문자를 HTML 엔티티로 변환하여 브라우저가 이를 순수한 텍스트로 인식하게 만듭니다.
#2 CSRF (Cross-Site Request Forgery) 공격 이해와 방어

#CSRF는 사용자가 의도하지 않은 요청을 보내도록 유도하여 공격자가 원하는 작업을 실행시키는 공격입니다. 예를 들어, 사용자가 로그인한 상태에서 악성 웹사이트를 방문했을 때, 보이지 않는 곳에서 #계정 비밀번호 변경이나 #게시글 삭제와 같은 요청이 자동으로 전송될 수 있습니다.
방어 방법: CSRF 토큰 사용

CSRF 공격을 방어하기 위한 가장 일반적인 방법은 #CSRF토큰을 사용하는 것입니다. CSRF 토큰은 사용자의 세션마다 고유하게 생성되는 무작위 문자열로, 요청이 들어올 때마다 서버에서 이 토큰의 유효성을 검증합니다.
1. 폼(Form) 생성 시 토큰 추가 요청을 보내는 #HTML #폼에 숨겨진(hidden) 입력 필드로 CSRF 토큰을 포함시킵니다.
<?php
// 세션이 시작되지 않았다면 시작
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
// CSRF 토큰 생성
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<form action="process.php" method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="text" name="data">
<button type="submit">전송</button>
</form>
2. 요청 처리 시 토큰 검증 요청을 받는 서버 측 #스크립트에서 세션에 저장된 토큰과 폼을 통해 전달받은 토큰이 일치하는지 확인합니다.

<?php
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
if (!empty($_POST['csrf_token']) && hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
// 토큰이 유효하면 정상적으로 처리
// ...
echo "요청이 성공적으로 처리되었습니다.";
} else {
// 토큰이 유효하지 않으면 요청을 거부
// ...
echo "유효하지 않은 요청입니다.";
}
?>
hash_equals() 함수는 문자열 비교에 사용되며, 두 문자열의 길이가 다를 경우에도 항상 동일한 실행 시간을 보장하여 #타이밍공격(timing attack)을 방지합니다.
요약 및 결론
#웹개발에서 #보안은 선택이 아닌 필수입니다. XSS 공격은 #입력값검증과 #출력이스케이프를 통해, CSRF 공격은 #CSRF토큰을 사용하여 효과적으로 방어할 수 있습니다. PHP의 내장 함수와 #세션 기능을 적극 활용하여 안전한 웹 애플리케이션을 구축하시길 바랍니다.
국내최다 다대역보유, KT본사IP, 블로그/쇼핑/SNS/지도마케팅,IP교체권무료지급
https://xn--299ao67b9qbmsf04c.net/
VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN
국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이
vpn.luzensoft.com
'프로그램 > PHP 중급' 카테고리의 다른 글
| 📚 PHP 중급 - 8주차: 웹 보안 기초 및 에러 핸들링 - 03 에러 보고 및 로그 설정 (0) | 2025.08.16 |
|---|---|
| 📚 PHP 중급 - 8주차: 웹 보안 기초 및 에러 핸들링- 02 비밀번호 보안 (해싱, 솔팅) (0) | 2025.08.14 |
| 📚 PHP 중급 - 7주차: MVC 패턴의 이해 및 적용- 03 URL 라우팅 기초 (0) | 2025.08.11 |
| 📚 PHP 중급 - 7주차: MVC 패턴의 이해 및 적용- 02 간단한 MVC 구조로 게시판 리팩토링 (0) | 2025.08.10 |
| 📚 PHP 중급 - 7주차: MVC 패턴의 이해 및 적용- 01 MVC (Model-View-Controller) 개념 (0) | 2025.08.09 |