[Web] XSS와 CSRF의 개념과 예방 방법

해피몬·2024년 10월 4일
post-thumbnail

XSS와 CSRF란? 🤔

웹 애플리케이션은 보안이 중요한데, 특히 XSS (Cross-Site Scripting)CSRF (Cross-Site Request Forgery)는 흔히 발생하는 두 가지 보안 취약점임. XSS는 악성 스크립트가 웹 페이지에 삽입되어 사용자에게 실행되는 공격이며, CSRF는 사용자가 의도하지 않은 요청이 자동으로 전송되도록 만들어, 인증된 사용자의 권한을 악용하는 공격임.

XSS(Cross-Site Scripting)란? 🌐

XSS는 악성 스크립트를 웹 애플리케이션에 주입하여, 사용자가 해당 스크립트를 실행하도록 하는 공격임. 이를 통해 공격자는 사용자의 세션 정보, 쿠키, 개인 정보를 탈취하거나, 악성 페이지로 리디렉션할 수 있음.

XSS의 종류

저장형 XSS (Stored XSS): 공격 스크립트가 서버에 저장되고, 웹 페이지 로딩 시 해당 스크립트가 실행됨. 주로 게시물이나 댓글과 같은 사용자 입력이 저장되는 곳에서 발생.

반사형 XSS (Reflected XSS): 공격 스크립트가 URL 파라미터나 GET 요청에 포함되어 서버에 전달되며, 응답에 포함되어 반환됨. 사용자 클릭이나 요청을 통해 즉시 실행됨.

DOM 기반 XSS: 악성 스크립트가 클라이언트 측의 DOM 조작을 통해 실행됨. 서버에 전송되지 않고 클라이언트 측에서만 발생하므로 탐지하기 어려움.

XSS 예방 방법 🛡️

XSS를 방지하려면 사용자 입력을 철저히 검증하고, 클라이언트에 전달하기 전에 특수 문자를 인코딩해야 함.

출력 시 이스케이프 처리

사용자 입력을 그대로 HTML에 출력하지 않고, <, >, &, " 등을 HTML 엔티티로 변환하여 실행을 방지함.

function escapeHtml(str) {
  return str.replace(/&/g, "&amp;")
            .replace(/</g, "&lt;")
            .replace(/>/g, "&gt;")
            .replace(/"/g, "&quot;")
            .replace(/'/g, "&#039;");
}

콘텐츠 보안 정책(Content Security Policy, CSP) 설정

CSP를 통해 페이지에서 실행되는 스크립트를 특정 도메인으로 제한함. 이를 통해 외부에서 삽입된 스크립트가 실행되지 않도록 막을 수 있음.

Content-Security-Policy: default-src 'self';

HTTP-Only 쿠키 사용

세션 쿠키에 HttpOnly 속성을 추가하여 JavaScript에서 접근을 차단함. 이는 공격자가 스크립트를 통해 쿠키 정보를 훔치는 것을 방지함.

라이브러리 사용

React, Angular와 같은 프레임워크는 자동으로 사용자 입력을 이스케이프 처리하여 XSS 공격을 방지함. 이러한 프레임워크를 사용하여 보안을 강화할 수 있음.

CSRF(Cross-Site Request Forgery)란? 🔗

CSRF는 사용자가 로그인한 상태에서 공격자가 해당 사용자의 권한을 도용해 악의적인 요청을 보내는 공격임. CSRF 공격을 통해 공격자는 사용자가 원하지 않는 행동을 유도하여 데이터를 수정하거나 삭제하는 등 악의적인 요청을 수행할 수 있음.

CSRF 공격 예제

예를 들어, 공격자가 악성 링크나 이미지를 통해 사용자가 특정 요청을 하게 만듦.

<img src="https://example.com/account/delete?user=target">

CSRF 예방 방법 🛡️

CSRF를 방지하기 위해서는 사용자가 의도한 요청인지 검증하는 방법이 필요함.

CSRF 토큰 사용

CSRF 토큰은 양식이나 요청에 임의의 토큰 값을 추가하여 해당 요청이 사용자의 요청임을 검증함. 서버는 요청 시마다 토큰을 확인해 CSRF 공격을 방지함.

<form action="/submit" method="POST">
  <input type="hidden" name="csrf_token" value="secureRandomToken123">
  <input type="submit" value="Submit">
</form>

SameSite 쿠키 속성 설정

SameSite 속성을 사용하여 동일한 사이트에서만 쿠키가 전송되도록 설정할 수 있음. 이렇게 설정하면 다른 사이트에서 전송된 요청은 세션을 공유할 수 없음.

사용자 재인증 요구

민감한 작업을 수행하기 전에 재인증(예: 비밀번호 입력)을 요구하여 CSRF 공격을 막을 수 있음. 이렇게 하면 공격자가 사용자 권한을 도용하여 임의로 중요한 작업을 수행할 수 없음.

CORS 정책 설정

CORS (Cross-Origin Resource Sharing)를 설정해 외부 도메인의 요청을 제한하여 CSRF를 방지할 수 있음. 신뢰할 수 없는 도메인의 요청은 차단되므로, 외부에서 오는 의도치 않은 요청을 방지할 수 있음.

profile
슬기로운개발생활🤖

0개의 댓글