- CSRF공격이란 인터넷 사용자(피해자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정,삭제,등록 등)를 특정 웹사이트에 요청하게 만드는 공격이다.
CSRF는 해커가 사용자의 컴퓨터를 감염시키거나, 서버를 해킹해서 이뤄지는 공격은 아니다. 그래서 다음과 같은 조건이 만족되어야 한다.
- 위조 요청을 전송하는 서비스에 피해자가 로그인한 상태
- 피해자가 해커가 만든 피싱 사이트에 접속
언뜻 보면 두 조건을 모두 만족하기 어려울것 같지만, 생각처럼 드문일은 아니다. 예를들면 구글/인스타그램/네이버 등 유명 사이트는 보통 PC에서 자동 로그인을 해놓은 경우가 많고, 피싱 사이트는 메일 등을 통해 접속될 수 있다. 또한 피해자가 해커가 만든 피싱 사이트를 접속하지 않더라도, 해커가 XSS공격을 성공한 정상 사이트를 통해 CSRF 공격이 수행될 수도 있다.
방법으로는 피해자가 웹사이트에 로그인하여 정상적인 쿠키를 발급받고, 공격자가 만든 특정 행위를 요청한다 라는 링크를 클릭하면 웹사이트에 로그인되어 정상적인 쿠키를 발급받았으므로, 웹사이트는 그 행위를 실행시켜주는 방식이다.
- 방어 방법으로는 대표적으로 2가지, Referrer 검증, Security Token 사용이 있다.
Referrer 검증 : 백엔드 단에서 요청의 referrer을 확인하여 도메인이 일치하는지 검증하는 방법이다. 일반적으로 레퍼러 검증만으로 대부분의 CSRF공격을 방어할수 있다. 하지만 같은 도메인 내의 페이지에 XSS 취약점이 있는 경우, CSRF공격에 취약해질 수 있다. 도메인 단위 검증에서 좀더 세밀하게 페이지 단위까지 일치하는지 검증을 하면 도메인 내의 타 페이지에서의 CSS취약점에 의한 CSRF공격을 방어할 수 있다.
Security Token 사용 : 레퍼러 검증이 불가한 환경이라면 보안 토큰을 활용할 수 있다. 우선 사용자의 세션에 임의의 난수 값을 저장하고 사용자의 요청마다 해당 난수값을 포함시켜 전송시킨다. 이후 백엔드 단에서 요청을 받을 때마다 세션에 저장된 토큰 값과 요청 파라미터에 전달되는 토큰 값이 일치하는지 검증하는 방법이다. 이 방법도 결국 같은 도메인 내에 XSS취약점이 있다면 CSRF공격에 취약해진다.