본문 바로가기
카테고리 없음

웹 보안 기초: XSS, CSRF 이해하기 (입문자용 실전 중심 가이드)

by yrahealingtime 2025. 4. 27.

웹 보안 기초: XSS, CSRF 이해하기 (입문자용 실전 중심 가이드)
웹 보안 기초: XSS, CSRF 이해하기 (입문자용 실전 중심 가이드)

 

웹 애플리케이션을 개발하면서 가장 많이 간과되는 영역이 바로 보안입니다. 기능은 잘 작동하는데, 보안이 취약하면 사용자 정보가 유출되고, 기업 이미지가 손상되며, 법적 책임까지 이어질 수 있습니다. 이 글에서는 가장 대표적인 웹 보안 취약점인 XSS(Cross-Site Scripting)와 CSRF(Cross-Site Request Forgery)를 중심으로, 초보자도 이해할 수 있는 쉬운 설명과 실습 가능한 예제를 통해 보안 기초를 다져보려 합니다. 개발자, 기획자, 운영자 누구에게나 유용한 내용이 될 수 있습니다.

 

XSS란 무엇인가?

XSS는 Cross-Site Scripting의 약자로, 공격자가 웹페이지에 악성 스크립트를 삽입하여 사용자 브라우저에서 해당 스크립트를 실행시키는 공격입니다. 예를 들어 댓글, 게시글, 검색어 입력란 등 사용자 입력값이 그대로 출력되는 경우 공격자가 의도한 JavaScript가 실행될 수 있습니다. 이는 쿠키 탈취, 세션 하이재킹, 피싱 등 다양한 2차 공격으로 이어질 수 있습니다.

XSS 예시 시뮬레이션

예를 들어 다음과 같은 입력폼이 있다고 가정합니다.

<form method="GET">
  이름: <input name="name">
  <input type="submit">
</form>

그리고 서버가 다음과 같이 name 값을 그대로 출력한다고 해봅시다.

안녕하세요, <?= $_GET['name'] ?> 님

이 상태에서 공격자가 다음과 같이 입력한다면?

"><script>alert('XSS')</script>

페이지가 로드될 때 알림창이 뜨게 됩니다. 단순한 예시지만, 이 방식으로 쿠키나 로그인 세션을 훔칠 수도 있습니다.

XSS의 유형

  • Stored XSS: 악성 스크립트가 DB에 저장되어 다수 사용자에게 노출
  • Reflected XSS: URL에 포함된 스크립트가 즉시 반영되어 실행
  • DOM-based XSS: 클라이언트 사이드 JavaScript가 DOM 조작을 통해 실행

방어 방법

  • 모든 사용자 입력값은 HTML Escape 처리
  • Content-Security-Policy 헤더 설정
  • React, Vue 등 프레임워크 템플릿 엔진 적극 활용

 

CSRF란 무엇인가?

CSRF는 Cross-Site Request Forgery의 약자입니다. 사용자가 로그인된 상태에서 공격자가 의도한 요청을 몰래 수행하게 만드는 공격입니다. 즉, 사용자의 인증정보를 악용해, 의도치 않은 요청이 서버에 전달되며 피해가 발생합니다.

CSRF 실제 예시

  1. 사용자가 쇼핑몰에 로그인한 상태로 브라우저를 열어둡니다.
  2. 공격자가 만든 피싱 사이트에 접속합니다.
  3. 해당 사이트에 다음과 같은 이미지 태그가 포함되어 있습니다.
<img src="https://target.com/buy?item_id=123&amount=10">

이 요청은 브라우저가 자동으로 보내며, 사용자는 아무 것도 클릭하지 않아도 구매 요청이 발생합니다. 서버는 쿠키 인증만으로 요청을 처리하기 때문에, 공격자의 요청을 정상 요청으로 받아들이는 문제가 발생합니다.

CSRF의 특징

  • 피해자는 로그인 상태의 사용자
  • 요청은 자동 실행되며 사용자가 인지하지 못함
  • 요청은 GET/POST 등 모든 방식 가능

방어 방법

  • CSRF Token 사용: 서버에서 무작위 토큰 발급 및 검증
  • Referer/Origin 헤더 검사
  • SameSite 쿠키 설정: 크로스 도메인 전송 방지

 

XSS vs CSRF 차이 비교

구분 XSS CSRF
공격 대상 사용자 브라우저 서버
피해자 사용자 개인 서비스 운영자
주요 기술 JavaScript 삽입 세션 쿠키 악용
방어법 입력값 필터링 CSRF Token 사용

실전 보안 습관 체크리스트

  • 모든 입력값을 신뢰하지 말 것
  • JSON.stringify, encodeURIComponent 적극 사용
  • 출력 전 반드시 Escape 처리
  • HTTPS는 선택이 아니라 필수
  • 보안 헤더 설정 (CSP, HSTS, X-Frame-Options 등)

 

마무리: 보안은 사용자를 배려하는 개발자의 자세

보안은 선택이 아닙니다. 개발자가 보안까지 고려하는 순간, 더 신뢰받는 서비스를 만들 수 있습니다. XSS와 CSRF는 실무에서 자주 발생하는 공격 유형이며, 실수 한 줄이 사용자 정보 유출로 이어질 수 있습니다. 이 글을 통해 보안 기초를 익혔다면, 다음 단계는 직접 코드에 적용하고 테스트하는 것입니다. 보안은 어려운 기술이 아니라, 배려에서 시작하는 습관입니다.