이번에는 크로스사이트 요청 위조 (CSRF, Cross-Site Request Forgery) 공격에 대해 설명하고, 이를 방어하는 방법을 다뤄보겠습니다. CSRF는 사용자가 인증된 세션을 보유한 상태에서 악의적인 요청을 서버에 보내게 만드는 공격입니다. 이 공격은 주로 사용자의 의도와 상관없이 서버에 요청을 보낼 수 있게 만들어, 비밀번호 변경이나 이메일 전송 등의 민감한 작업을 악용할 수 있습니다.
10. 크로스사이트 요청 위조 (CSRF, Cross-Site Request Forgery) 공격
10.1. CSRF 개요
CSRF (Cross-Site Request Forgery) 공격은 사용자가 인증된 세션을 보유하고 있을 때, 악의적인 웹사이트가 사용자의 이름으로 HTTP 요청을 보내는 공격입니다. CSRF 공격은 사용자가 로그인한 상태에서, 악의적인 웹사이트가 사용자의 인증 정보를 이용해 특정 요청을 자동으로 전송하도록 유도하는 방식입니다.
예를 들어, 사용자가 온라인 뱅킹 사이트에 로그인해 있을 때, 악의적인 공격자가 사용자를 속여서 돈을 송금하는 요청을 해당 사이트로 전송하게 만들 수 있습니다. 이 공격은 사용자가 악의적인 사이트를 방문하는 것만으로 발생할 수 있기 때문에 매우 위험합니다.
10.2. CSRF 공격 발생 원인
CSRF 공격은 다음과 같은 상황에서 발생할 수 있습니다:
- 웹사이트가 사용자의 인증 정보를 쿠키로 저장하고, 이 쿠키를 자동으로 요청에 포함하는 경우. 사용자가 인증된 상태에서 다른 악성 사이트에 접근하면, 이 쿠키를 자동으로 포함하여 요청을 전송하게 됩니다.
- 폼 제출이나 URL 호출을 통해 민감한 작업을 할 수 있는 기능을 제공하는 경우, CSRF를 막을 검증 절차가 없다면 공격자가 이 기능을 악용할 수 있습니다.
10.3. CSRF 공격 예시
- 인증된 사용자 세션을 악용한 요청
- 예를 들어, 사용자가 온라인 쇼핑몰에 로그인한 상태에서, 악의적인 사이트에서 상품 구매를 유도할 수 있습니다.
<html>
<body>
<form action="http://victim.com/transfer" method="POST">
<input type="hidden" name="amount" value="1000">
<input type="hidden" name="to_account" value="attacker_account">
</form>
<script type="text/javascript">
document.forms[0].submit(); // 폼을 자동으로 제출
</script>
</body>
</html>
이미지나 다른 자원으로 요청 보내기
- CSRF 공격은 GET 요청도 악용할 수 있습니다. 예를 들어, 이미지 태그나 JavaScript를 통해 이미지 다운로드나 링크 클릭이 자동으로 이루어지게 유도할 수 있습니다.
<img src="http://victim.com/change_password?new_password=attackerpassword" />
이 경우, 사용자가 로그인된 상태라면, 위의 요청이 서버로 자동으로 보내져 비밀번호가 변경될 수 있습니다.
10.4. CSRF 공격의 영향
CSRF 공격이 성공하면, 공격자는 사용자가 인증된 세션을 이용해 다음과 같은 피해를 초래할 수 있습니다:
- 민감한 작업 수행: 비밀번호 변경, 이메일 전송, 계좌 이체 등 사용자가 인증된 상태에서만 수행할 수 있는 민감한 작업을 악의적으로 조작할 수 있습니다.
- 계정 탈취: 공격자가 사용자의 계정을 탈취하거나, 권한을 상승시킬 수 있습니다.
- 서비스 악용: 서비스 내에서 발생할 수 있는 작업을 자동화하여 시스템을 악용할 수 있습니다.
10.5. CSRF 대응 방안
CSRF 공격을 방어하기 위해서는 요청의 유효성 검증과 인증 정보를 안전하게 관리하는 방법을 사용해야 합니다. 주요 대응 방법은 다음과 같습니다:
- CSRF 토큰 사용예시 (폼에 CSRF 토큰 포함):서버에서 CSRF 토큰을 생성하고, 이를 세션이나 쿠키에 저장한 후, 클라이언트가 요청을 보낼 때마다 CSRF 토큰을 확인합니다.
<form action="/submit" method="POST">
<input type="hidden" name="csrf_token" value="unique_token_from_server">
<input type="text" name="data">
<input type="submit" value="Submit">
</form>
- 가장 일반적인 CSRF 방어 방법은 CSRF 토큰을 사용하는 것입니다. 각 요청에 대해 서버는 고유한 CSRF 토큰을 생성하고, 클라이언트가 이를 제출하도록 요구합니다. 서버는 요청이 올 때, 이 토큰이 유효한지 확인하여 CSRF 공격을 차단할 수 있습니다.
SameSite 쿠키 속성 사용
Set-Cookie: sessionid=xyz; SameSite=Strict;
SameSite=Strict 설정은 같은 사이트에서의 요청에 대해서만 쿠키를 전송하며, 외부 사이트에서 발생한 요청에는 쿠키를 포함시키지 않습니다.
- SameSite 쿠키 속성은 CSRF 공격을 방어하는 데 유효합니다. SameSite 속성을 설정하면, 브라우저가 크로스 사이트 요청에서 쿠키를 자동으로 포함시키지 않도록 할 수 있습니다. 이 속성은 Strict와 Lax 모드를 제공하며, 이를 사용하여 외부 사이트에서 발생하는 요청에 대한 쿠키 전송을 제한할 수 있습니다.
- 리퍼러 검증 (Referer Validation)예시:
if ($_SERVER['HTTP_REFERER'] != "https://trustedsite.com") {
die("잘못된 요청입니다.");
}
- 요청의 Referer 헤더를 확인하여 요청이 같은 도메인에서 왔는지 확인하는 방법입니다. 만약 외부 사이트에서 요청을 보내면, Referer 헤더가 일치하지 않으므로 이를 차단할 수 있습니다.
- POST 요청 사용
- 민감한 작업은 가능한 POST 요청으로 처리하고, GET 요청을 통해 민감한 작업을 하지 않도록 해야 합니다. GET 요청은 URL에 파라미터를 포함할 수 있기 때문에 CSRF 공격을 받을 가능성이 높습니다.
로그인 후 세션 토큰 변경
session_regenerate_id(true); // 로그인 후 세션 ID 변경
- 로그인 후, 세션 ID나 인증 토큰을 변경하여 세션 하이재킹이나 CSRF 공격을 방지할 수 있습니다. 사용자가 로그인한 후에는 반드시 새로운 세션 ID를 발급받도록 해야 합니다.
- 수동 인증 확인
- 민감한 요청을 처리할 때, 추가적인 인증을 요구하는 방법도 있습니다. 예를 들어, 사용자가 비밀번호 입력이나 OTP(One-Time Password)를 입력해야만 요청을 처리할 수 있도록 할 수 있습니다.
10.6. 결론
CSRF 공격은 사용자의 인증 정보를 악용하여 민감한 작업을 자동으로 수행하게 만드는 공격입니다. 이를 방어하기 위해서는 CSRF 토큰 사용, SameSite 쿠키 속성 설정, Referer 헤더 검증 등 다양한 보안 조치를 적용해야 합니다. 또한 POST 요청 사용, 세션 토큰 변경 등도 효과적인 방어 방법입니다. CSRF는 사용자와 웹 애플리케이션 간의 신뢰를 악용하는 공격이기 때문에, 예방을 위한 조치를 철저히 해야 합니다.
'IT' 카테고리의 다른 글
| XML 외부 엔티티 (XXE, XML External Entity) 공격 (0) | 2025.07.15 |
|---|---|
| 서비스 거부 (Denial of Service, DoS) 공격 (1) | 2025.07.15 |
| 인증 우회 (Authentication Bypass) 공격 (0) | 2025.07.15 |
| 서버 사이드 요청 위조 (SSRF, Server-Side Request Forgery) 공격 (0) | 2025.07.15 |
| 크로스 사이트 스크립팅 (XSS, Cross-Site Scripting) 공격 (1) | 2025.07.15 |