사이트간 요청 위조 공격 (Cross-Site Request Forgery, XSRF)

개념

  • 사이트간 요청 위조(CSRF)는 사용자가 의도하지 않은 요청을 악의적인 웹사이트를 통해서 공격하는것
  • 사용자가 이미 인증된 상태일경우, 해당 사용자의 권한을 이용하여 웹 애플리케이션에서 악의적인 작업을 수행하도록 유도한다.

Ex) 사용자가 의도하지 않은 금융 거래, 불법 광고, 설정 변경, 이메일 전송

사용자는 자신이 수행하지 않은 악의적인 작업으로인해 피해를 입으며, 특히 금융 거래나 개인 정보가 포함된 경우 심각한 결과를 초래할 수 있다.

공격 분석

CSRF 공격은 아래의 단계대로 수행된다.

1.사용자 인증

사용자가 웹사이트에 로그인하여 세션이 유지되고 있는 상태

2.공격 사이트 접근

악의적인 웹사이트에서 사용자가 인증된 세션을 가진 웹사이트에 요청을 보내도록 만듬

3.악의적인 요청 전송

사용자가 방문한 악의적인 웹사이트는 사용자가 인증된 상태에서 특정 요청을 보내도록 강제

대응 방안

1. REST 원칙에따른 설계

  • RESTful API 설계시, GET 요청은 데이터 조회에만 사용하고, 상태를 변경하는 요청(POST, PUT, DELETE 등)은 CSRF 방어 기능이 있는 요청 헤더나 토큰을 요구한다.
  • 브라우저는 외부 사이트에서 임의로 POST 요청에 인증 헤더나 토큰을 넣는 것이 제한되기 때문에, REST 원칙을 따르면 공격이 어렵다.

즉, 데이터를 조회하는 GET 요청상태를 변경하지 않도록 명확히 설계하는 것이 중요하다.

2. 안티 CSRF 공격 쿠키 구현

  • 서버는 클라이언트에게 CSRF 토큰을 발급하고, 이를 HTML 폼 안에 숨겨서 함께 보낸다.
  • 사용자가 요청을 보낼 때 폼 내부의 토큰 값과 쿠키 또는 세션에 저장된 값이 일치하는지 확인한다

이 토큰은 예측 불가능하고 사용자 세션마다 다르기 때문에, 공격자가 토큰 값을 알지 못하면 요청이 실패하게 된다.

예: csrf_token hidden input 필드 + 서버 측 검증

3. SameSite 쿠키 속성 사용

  • SameSite 속성은 쿠키가 다른 출처(origin)에서 발생한 요청에는 자동으로 전송되지 않도록 제한한다.
  • SameSite=Lax
    GET 요청은 허용하지만, POST 같은 상태 변경 요청은 차단
  • SameSite=Strict
    다른 출처에서 온 모든 요청에 대해 쿠키 전송 차단
  • SameSite=None; Secure
    제3자 쿠키 허용하지만 HTTPS에서만 작동

CSRF는 다른 출처의 웹사이트를 통해 발생하기 때문에, 이 속성을 활용하면 브라우저가 쿠키를 전송하지 않아 공격이 무력화 할 수 있다.

4. 작업에 대한 재인증(reauthentication)

  • 중요하거나 민감한 작업(예: 비밀번호 변경, 결제 등)에 대해 다시 한 번 비밀번호나 인증 수단을 요청하는 방식
  • 재인증의경우 CSRF 공격이 들어와도, 해당 요청을 완료하려면 사용자의 직접적인 인증이 필요하므로 공격이 실패한다.

사용자 인증이 명확히 요구되는 작업에는 추가 인증 절차를 넣어 안전성을 높이는것이 중요하다

🗒️ 요약

CSRF 공격은 공격자가 다른 사이트의 웹 요청을 사용하여 사용자가 원치 않은 작업을 수행하도록 속일 수 있다.
대처 방안은 아래와 같다.

  1. GET 요청에 문제가 없는지 확인하여 사용자가 악의적인 링크를 클릭해도 서버 상태가 변경되지 않도록 한다.
  2. 안티 CSRF 공격 쿠키를 사용하여 다른 유형의 요청을 보호한다.
  3. 다른 사이트에서 생성된 요청에서 쿠키를 분리하기위해 SameSite 속성을가진 쿠키를 설정한다.

Cross Site Scripting vs Cross Site Request Forgery

  Cross Site Scripting Cross Site Request Forgery
의의 용자의 브라우저에서 악성 스크립트를 실행시키는 것 사용자의 인증된 상태를 악용해 공격자가 원하지 않는 요청을 보내는 것
방식 웹사이트에 악성 JavaScript를 삽입시, 사용자가 페이지를 열면 그 스크립트가 실행 피해자가 로그인된 상태에서, 공격자가 만든 악성 링크/요청을 클릭하면 실제 서버에 요청이 전송
목적 쿠키 탈취, 세션 하이재킹, 피싱 등 피해자 권한을 이용한 무단 요청
예시 댓글란에 alert('해킹'); 삽입 → 누가 보면 팝업 뜸 피해자가 은행 로그인 상태일 때, 공격자의 사이트에 접속 → 모르게 송금 요청이 서버에 전달됨

댓글남기기