CSRF 공격으로부터 웹 애플리케이션을 안전하게 보호하는 방법

by DD
2개월 전
조회수 2

CSRF(Cross-Site Request Forgery) 공격은 사용자가 로그인된 상태에서 악성 웹사이트를 통해 원치 않는 작업을 수행하도록 유도하는 공격 방식이다.

HTTP GET 요청을 통한 데이터 변경을 허용하는 웹 애플리케이션은 CSRF 공격에 취약하며, 공격자는 이미지 태그 등을 활용하여 공격을 시도한다.

CSRF 공격을 방어하기 위해 HTTP POST 요청 사용, CSRF 토큰(CSRF Token)을 활용한 '일회용 폼' 구현이 권장된다.

CSRF 토큰(CSRF Token)은 무작위 문자열로 생성되어야 하며, 사용자 세션 또는 개별 폼마다 갱신되어야 한다.

CSRF 공격의 원리

CSRF 공격은 사용자가 로그인된 상태에서 악성 웹사이트(Malicious Website)가 사용자의 권한을 도용하여 특정 작업을 수행하도록 유도하는 공격이다. 특히, HTTP GET 요청을 통해 데이터 변경이 가능한 웹 애플리케이션은 CSRF 공격에 취약하다. 공격자는 HTML 이미지 태그를 사용하여 사용자가 인지하지 못하는 사이에 악성 요청을 실행할 수 있다. 데이터 격리 아키텍처(Data Isolation Architecture)가 미흡한 경우, 공격 성공 시 심각한 피해를 야기할 수 있다.

CSRF 방어 기법: CSRF 토큰(CSRF Token) 활용

CSRF 공격을 방어하기 위해 가장 널리 사용되는 방법은 CSRF 토큰(CSRF Token)을 활용하는 것이다. CSRF 토큰은 서버 측에서 생성되어 폼의 hidden 필드 또는 AJAX 요청의 헤더에 포함된다. 서버는 폼 제출 시 CSRF 토큰의 유효성을 검사하여, 위조된 요청을 차단한다. CSRF 토큰(CSRF Token)은 예측 불가능한 무작위 문자열이어야 하며, 사용자 세션 또는 개별 폼마다 갱신되어야 한다.

HTTP GET 요청의 위험성

게시글에서는 중요한 트랜잭션(Data Alteration)은 HTTP GET 요청을 통해 실행되어서는 안 된다고 강조한다. HTTP GET 요청은 브라우저의 캐싱 및 사전 로딩 기능으로 인해 CSRF 공격에 악용될 가능성이 높다. 따라서 데이터 변경과 관련된 작업은 HTTP POST 요청을 사용하고, CSRF 토큰(CSRF Token)을 통해 요청의 진위 여부를 검증해야 한다. 데이터 미저장 정책(Zero-Retention Policy)을 적용하여 공격의 영향을 최소화하는 것도 중요하다.

AJAX 요청에서의 CSRF 방어

AJAX 요청을 통한 CSRF 공격 방어는 CSRF 토큰(CSRF Token)을 HTTP 헤더에 포함하거나, 요청 본문에 데이터를 담는 방식으로 구현할 수 있다. 댓글에서는 AJAX 요청의 본문(Body)에 모든 데이터를 포함하는 것이 더 간편하다는 의견이 제시되었다. 하지만, 헤더를 사용하는 방식이 보안 측면에서 더 안전하다는 의견도 존재한다. 멀티모달 분석(Multimodal Analysis)을 통해 다양한 공격 시나리오를 분석하고, 적절한 방어 전략을 수립해야 한다.

Secure Programming of Web Applications: Cross-Site Request Forgery (CSRF)