교차사이트 요청위조 (CSRF)
쉽게 풀면
은행 사이트에 로그인해둔 상태에서 다른 수상한 웹페이지를 열었더니, 그 페이지가 몰래 은행 사이트에 "돈을 이체하라"는 요청을 대신 보내버리는 상황을 생각하면 됩니다. 사용자는 자신이 그런 요청을 보냈다는 사실조차 모릅니다. 은행 사이트 입장에서는 로그인된 사용자의 브라우저에서 온 요청이라 정상적인 요청으로 착각하고 처리해버립니다. 즉 공격자는 사용자의 신뢰 관계(로그인 상태)를 훔쳐 이용하는 셈입니다.
왜 중요한가
CSRF는 비밀번호 변경, 송금, 계정 설정 변경처럼 사용자가 의도하지 않은 중요한 동작을 몰래 실행시킬 수 있어 웹 애플리케이션 보안에서 오랫동안 주요 취약점 유형으로 다뤄져 왔습니다. 특히 로그인 세션을 이용한다는 특성 때문에 인증 메커니즘과 함께 연구되는 경우가 많습니다.
논문에서는 이렇게 쓰입니다
매 요청마다 확인해야 할 고유한 검증값(토큰)이 제대로 검사되지 않아 공격이 성공할 수 있었던 사례를 설명하고 있습니다.
브라우저가 다른 사이트에서 시작된 요청에는 쿠키를 자동으로 함께 보내지 않도록 제한하는 기능이 방어에 도움이 되었다는 설명입니다.
조금 더 깊게 보면
CSRF를 방어하는 대표적인 방법으로는 요청마다 예측 불가능한 고유 값을 포함시켜 검증하는 CSRF 토큰 방식, 그리고 브라우저 차원에서 교차 사이트 요청에 쿠키 전송을 제한하는 SameSite 쿠키 속성이 있습니다. CSRF는 사용자를 속여 악성 스크립트를 실행시키는 크로스사이트 스크립팅(XSS)과 혼동되기 쉽지만, CSRF는 스크립트 실행이 아니라 신뢰된 세션을 이용한 요청 위조에 초점이 있다는 점에서 차이가 있습니다.
주의할 점
CSRF는 GET 요청만이 아니라 POST 요청을 통한 상태 변경 동작에서도 발생할 수 있으므로, 요청 방식과 무관하게 상태를 변경하는 모든 엔드포인트에 대해 방어가 필요합니다.