IT이야기/보안

CSRF(크로스 사이트 요청 위조): 웹 애플리케이션 보안 위협과 대응 전략

Chiba-in 2025. 3. 1. 17:15

🔹 CSRF란?

1. CSRF(Cross-Site Request Forgery)의 정의

크로스 사이트 요청 위조(CSRF, Cross-Site Request Forgery)공격자가 피해자의 인증된 세션을 이용해 의도하지 않은 요청을 서버에 전송하는 웹 보안 공격 기법입니다. 사용자가 로그인된 상태에서 공격자가 조작한 악성 요청을 수행하면 피해자는 의도치 않은 금융 거래, 비밀번호 변경, 계정 탈취 등의 피해를 입을 수 있습니다.

CSRF의 주요 특징:

  • 사용자의 인증된 세션을 악용하여 악의적인 요청을 실행
  • 사용자의 개입 없이 자동으로 요청이 전송될 수 있음
  • GET, POST 요청을 포함한 다양한 HTTP 요청을 악용 가능
  • 피해자가 신뢰하는 웹사이트의 권한을 이용하는 공격 방식

📌 CSRF 공격은 피해자가 로그인된 상태에서 발생할 가능성이 높으며, 강력한 보안 조치가 필요합니다.


🔹 CSRF 공격 시나리오 및 기법

1. 악성 링크 클릭 유도

사용자가 악성 링크를 클릭하면 공격자가 원하는 요청이 자동으로 실행됨

✔️ 공격 시나리오:

  • 피해자가 로그인된 상태에서 공격자가 제공한 악성 링크를 클릭함
  • 링크에는 공격자가 미리 설정한 조작된 요청이 포함됨
  • 요청이 피해자의 인증된 세션에서 실행되어 공격이 성공함

✔️ 악성 링크 예제:

<a href="http://example.com/transfer?to=attacker&amount=1000">Click Here</a>

📌 사용자가 링크를 클릭하는 순간, 계좌에서 공격자에게 돈이 이체될 수 있습니다.

2. 자동 실행되는 악성 스크립트 삽입

공격자가 악성 HTML 또는 JavaScript를 피해자의 브라우저에서 실행하도록 유도

✔️ 공격 시나리오:

  • 악성 웹사이트를 방문하면 브라우저가 자동으로 조작된 요청을 서버에 전송
  • 사용자의 인증 세션을 이용하여 관리자 권한 변경, 데이터 삭제 등의 작업 수행

✔️ 자동 실행 스크립트 예제:

<img src="http://example.com/delete_account" width="0" height="0">

📌 사용자가 인식하지 못한 상태에서 중요한 요청이 실행될 수 있습니다.

3. CSRF를 활용한 계정 탈취

CSRF 공격을 통해 사용자의 비밀번호를 변경하거나 이메일을 수정하여 계정을 탈취

✔️ 공격 시나리오:

  • 피해자가 로그인된 상태에서 공격자의 악성 요청이 실행됨
  • 계정 정보 변경 요청이 공격자의 이메일로 전송됨
  • 공격자가 이메일 인증을 통해 비밀번호를 변경하고 계정 탈취

📌 CSRF 방어 기법이 적용되지 않으면 공격자가 계정 탈취를 시도할 수 있습니다.


🔹 CSRF 공격을 방어하는 방법

1. CSRF 토큰(CSRF Token) 사용

각 요청마다 고유한 토큰을 포함하여 요청의 유효성을 검증

✔️ CSRF 토큰 적용 방법:

  • 서버가 CSRF 토큰을 생성하여 사용자의 폼에 포함
  • 사용자가 요청을 보낼 때 해당 토큰을 함께 전송
  • 서버에서 토큰을 검증하여 유효하지 않은 요청 차단

✔️ CSRF 토큰 예제 (HTML + PHP):

<form action="/transfer" method="POST">
    <input type="hidden" name="csrf_token" value="random_token_value">
    <input type="text" name="amount">
    <button type="submit">송금</button>
</form>
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF 공격이 감지되었습니다.");
}

📌 CSRF 토큰을 활용하면 공격자가 임의로 요청을 생성하기 어렵습니다.

2. SameSite 쿠키 속성 활용

SameSite 속성을 설정하면 CSRF 공격을 방지할 수 있습니다.

✔️ SameSite 설정 방법:

  • Strict: 외부 사이트에서 요청을 보낼 수 없음
  • Lax: 사용자가 링크를 클릭한 경우에만 요청 허용
  • None: 제3자 사이트에서도 요청 가능 (보안 위험 증가)

✔️ SameSite 쿠키 예제 (PHP):

setcookie("session", "value", ["samesite" => "Strict", "secure" => true, "httponly" => true]);

📌 쿠키의 SameSite 속성을 Strict로 설정하면 CSRF 공격을 효과적으로 방어할 수 있습니다.

3. CORS 정책 제한 (Cross-Origin Resource Sharing)

서버가 신뢰할 수 없는 출처에서의 요청을 차단하도록 설정

✔️ CORS 설정 예제 (Express.js):

app.use((req, res, next) => {
    res.setHeader("Access-Control-Allow-Origin", "https://trusted-site.com");
    res.setHeader("Access-Control-Allow-Methods", "POST, GET");
    next();
});

📌 CORS 정책을 통해 외부 사이트에서의 비정상적인 요청을 제한할 수 있습니다.

4. HTTP Referer 및 Origin 검증

서버에서 요청의 출처를 확인하여 신뢰할 수 없는 요청 차단

✔️ Referer 검증 예제 (PHP):

if (strpos($_SERVER['HTTP_REFERER'], "trusted-site.com") === false) {
    die("CSRF 공격 감지!");
}

📌 출처 검증을 수행하면 외부에서의 비정상적인 요청을 차단할 수 있습니다.


📌 결론

CSRF(Cross-Site Request Forgery)는 사용자의 세션을 악용하여 의도하지 않은 요청을 실행하는 보안 공격 기법입니다.
CSRF 토큰 적용, SameSite 쿠키 설정, CORS 정책 제한 등의 다양한 방어 기법을 활용해야 합니다.
HTTP Referer 및 Origin 검증을 통해 신뢰할 수 없는 요청을 차단할 수 있습니다.
웹 애플리케이션 개발자는 CSRF 방어 기법을 필수적으로 적용하여 보안성을 강화해야 합니다.

🚀 지금 바로 보안 점검을 수행하고, CSRF 공격으로부터 웹 애플리케이션을 보호하세요!