CSRF(Cross-Site Request Forgery)는 사용자가 자신의 의지와 상관없이, 공격자가 만들어 놓은 악성 웹사이트나 이메일 등을 통해, 사용자의 권한으로 서버에 원치 않는 요청을 보내도록 유도하는 공격입니다.
간단하게 말하면, 사용자가 A라는 웹사이트에 로그인한 상태에서, 공격자가 만든 B라는 악성 웹사이트를 방문했을 때, B 웹사이트가 A 웹사이트에 사용자의 권한으로 특정 동작 (예: 계정 정보 변경, 게시글 작성, 돈 송금 등)을 수행하도록 요청하는 것입니다.
핵심:
- 사용자는 인지하지 못함: 공격이 사용자의 눈에 띄지 않게 백그라운드에서 이루어질 수 있습니다.
- 사용자 권한 악용: 공격은 이미 로그인되어 있는 사용자의 권한을 빌려서 실행됩니다.
- 출처 검증 미흡: 서버가 요청의 출처를 제대로 확인하지 않아 발생하는 취약점입니다.
예시:
- 사용자가 은행 웹사이트에 로그인한 상태입니다.
- 공격자는 "꽁돈 지급 이벤트!"와 같은 흥미로운 제목의 이메일을 보냅니다.
- 사용자가 이메일의 링크를 클릭하여 공격자가 만든 악성 웹사이트를 방문합니다.
- 악성 웹사이트에는 은행 웹사이트로 특정 금액을 공격자의 계좌로 송금하는 요청이 숨겨져 있습니다.
- 브라우저는 사용자가 은행 웹사이트에 로그인한 상태이므로, 이 요청에 사용자의 세션 정보(쿠키 등)를 자동으로 포함하여 은행 서버로 보냅니다.
- 은행 서버는 요청이 정상적인 사용자의 요청이라고 착각하고 송금을 처리합니다.
방어 방법:
- CSRF 토큰 사용: 서버에서 각 세션마다 예측 불가능한 고유한 토큰을 생성하여 폼 데이터나 요청 파라미터에 포함시키고, 요청을 처리할 때 이 토큰의 유효성을 검증합니다.
- Referer 헤더 검증: 요청의 Referer 헤더를 확인하여 요청이 허용된 출처에서 발생했는지 검증합니다 (하지만 Referer 헤더는 위변조될 수 있으므로 완벽한 방법은 아닙니다).
- SameSite 쿠키 설정: 쿠키가 동일한 사이트 내의 요청에만 전송되도록 설정하여 외부 사이트에서의 요청에는 쿠키가 포함되지 않도록 합니다.
- HTTP 메서드 제한: 중요한 변경 작업을 수행하는 요청에는 GET 메서드 대신 POST, PUT, DELETE 등의 메서드를 사용하고, 이에 대한 출처 검증을 강화합니다.
간단하게 CSRF는 **"나도 모르게 내 권한으로 다른 사람이 시키는 대로 하는 것"**이라고 생각하시면 됩니다.
핵심
CSRF는 나도 모르게 내 권한으로 다른 사람이 시키는 대로 하는 것.
CSRF를 방어하기 위해서는 주로 Synchronizer Token를 사용. 요청의 유효성을 검사.
Share article