CSRF 공격이란
CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격입니다.
⇒ 즉, 공격자의 요청이 사용자의 요청인 것처럼 속이는 공격 방식 , XSS와 비슷하지만 XSS는 세션이 없어도 가능합니다.
예를 들어, 피해자의 전자 메일 주소를 변경하거나 암호를 변경하거나 자금이체를 하는 등의 동작을 수행하게 할 수 있습니다. 특성에 따라, 공격자는 사용자의 계정에 대한 완전한 제어권을 얻을 수 있을 수도 있습니다.
CSRF 동작 원리
CSRF가 성공하려면, 아래 3가지조건이 만족되어야 합니다.
- 사용자는 보안이 취약한 서버로부터 이미 로그인되어 있는 상태여야 함
- 쿠키 기반의 서버 세션 정보를 획득할 수 있어야 함
- 공격자는 서버를 공격하기 위한 요청 방법에 대해 미리 파악하고 있어야 함
예상하지 못한 요청 매개변수가 없어야 함
이 조건이 만족되면 다음과 같은 과정을 통해 CSRF 공격을 할 수 있습니다.
언뜻 보면 이 조건들을 만족하기가 어려울 것 같지만, 요즘은 보통 PC에서 자동 로그인을 해놓은 경우가 많고 피싱 사이트는 피싱 메일, 음란 사이트 등을 통해 접속될 수 있습니다. 핫핫
공격을 당하는 방식은 다음과 같습니다. 보시죵!
- 사용자는 보안이 취약한 서버에 로그인합니다.
- 서버에 저장된 세션 정보를 사용할 수 있는 session ID가 사용자의 브라우저 쿠키에 저장됩니다.
- 공격자는 사용자가 악성 스크립트 페이지를 누르도록 유도합니다.
악성 스크립트 페이지를 누르도록 유도하는 방식은 아래와 같은 방식들이 있습니다.
- 게시판이 있는 웹 사이트에 악성 스크립트를 게시글로 작성하여 사용자들이 게시글을 클릭하도록 유도
- 메일 등으로 악성 스크립트를 직접 전달하거나, 악성 스크립트가 적힌 페이지 링크를 전달
이러한 일을 막기위해 대표적인 CSRF 공격 방어 방법 몇가지를 살펴봅시다.
CSRF 공격 방어 방법
Referrer 검증
백엔드 단에서 request의 referer를 확인하여 domain이 일치하는지 검증하는 방법입니다.
일반적으로 referrer 검증만으로 대부분의 CSRF 공격을 방어할 수 있습니다.
하지만 같은 도메인 내의 페이지에 XSS 취약점이 있는 경우 CSRF 공격에 취약해질 수 있습니다. domain 단위 검증에서 좀 더 세밀하게 페이지 단위까지 일치하는지 검증을 하면 도메인 내의 타 페이지에서 XSS 취약점에 의한 CSRF 공격을 방어할 수 있습니다.
Security Token 사용 (= CSRF Token)
Referrer 검증이 불가한 환경이라면, Security Token 를 활용할 수 있습니다.
우선 사용자의 세션에 임의의 난수 값을 저장하고 , 사용자의 요청 마다 해당 난수 값을 포함시켜 전송시킵니다.
이후 백엔드 단에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증하는 방법입니다.
이 방법도 결국 같은 도메인 내에 XSS 취약점이 있다면 CSRF 공격에 취약해집니다.
Double Submit Cookie 검증
Double Submit Cookie 검증은 Security Token 검증의 한 종류로 세션을 사용할 수 없는 환경에서 사용할 수 있는 방법입니다.
웹 브라우저의 Same Origin 정책으로 인해 자바스크립트에서 타 도메인의 쿠키 값을 확인/수정하지 못한다는 것을 이용한 방어 기법입니다. 스크립트 단에서 요청 시 난수 값을 생성하여 쿠키에 저장하고 동일한 난수 값을 요청 파라미터 (혹은 헤더)에도 저장하여 서버로 전송합니다.
그렇게 되면 서버 단에서는 쿠키의 토큰 값과 파라미터의 토큰 값이 일치하는 지만 검사하면 됩니다. 서버에 따로 토큰 값을 저장할 필요가 없어 위에서 살펴본 세션을 이용한 검증보다 개발 공수가 적은 편입니다.