[웹 보안] CSRF
CSRF(Cross-Site-Request-Forgery)란?
크로스 사이트 요청 위조는 인증된 사용자의 권한으로 해당 사용자와 무관한 작업을 수행하는 것을 말합니다.
일반적인 사이트는 로그인을 성공했을 시 토큰, 세션 등을 통해 사용자를 식별합니다.
쿠키에 해당 값이 저장되었을 때, 브라우저는 요청을 보낼 때 자동으로 쿠키를 함께 전송합니다.
문제는, 사용자가 A 사이트(예: 은행 사이트)에 로그인한 상태에서 악성 B 사이트를 방문했을 때,
B 사이트에 의해 A 사이트로 요청이 자동 전송될 수 있다는 점입니다.
이때 쿠키에 저장된 토큰이나 세션도 함께 전송되기 때문에, 사용자는 모르게 A 사이트에서 악의적인 요청이 실행될 수 있습니다.
CSRF 예시
사용자가 A 은행에 로그인한 상태에서 악성 사이트(B 사이트)를 방문했을 때,
B 사이트는 사용자의 브라우저를 통해 A 은행으로 요청을 보냅니다.
이때 요청에는 사용자의 세션 쿠키가 함께 전송되므로, A 은행은 이를 정상 사용자 요청으로 인식하고 출금 등의 작업을 처리할 수 있습니다.
CSRF 취약점 방어
1. CSRF 토큰
CSRF 토큰을 사용하여 서버에서 생성한 랜덤 토큰을 각 요청마다 포함을 시키는 것입니다. 서버에 요청을 보내면 해당 CSRF 토큰을 검증하고 요청을 처리하는 방식입니다.
스프링 시큐리티에서 해당 관련 설정을 하고 페이지를 열었을 때 작업 관리자를 통해 확인을 하면 CSRF 토큰 값이 생성된 것을 확인할 수 있습니다.
2. Same-Site 쿠키 속성 설정하기
해당 속성을 설정했을 시 A사이트에서 로그인을 성공한 후 B사이트에 요청을 보냈을 때 A사이트에서 발급한 쿠키 값들이 전송되지 않게 하는 속성입니다. 해당 설정은 CSRF 공격을 크게 줄일 수 있는 효과적인 방법입니다.
- Strict : 완전 엄격 모드. 다른 사이트에서 오는 모든 요청에 대해 쿠키를 전송하지 않습니다.
- Lax : 느슨한 모드. 일부 안전한 요청(GET, HEAD 등)에서는 쿠키를 전송하지만, 위험한 요청(POST 등)에는 전송하지 않습니다.
- None : 모든 상황에서 쿠키를 전송합니다. 단, Secure 속성(HTTPS)이 함께 설정되어야 합니다.
3. 사용자 상호작용 요구
중요한 작업을 수행하는 경우 사용자에게 비밀번호 재입력 또는 2차 비밀번호 등 상호작용을 통해 자동화된 CSRF 공격을 막을 수 있습니다.
4. Referer 헤더 검사
Referer 헤더 검사를 통해 요청이 정상적인 출처에서 온 것인지 확인을 하는 방식입니다.
하지만 Referer 헤더 검사는 완벽하지 않습니다.
- 모든 요청이 Referer 헤더가 존재한다는 보장이 없음
- 프라이버시 모드를 킨 상태에서는 Referer 헤더가 존재하지 않음