[CSRF] Cross Site Request Forgery

chiyongs·2023년 3월 23일
2

Spring Security를 도입하여 프로젝트를 진행하면서 403 Forbidden 에러를 마주했습니다. 😢
에러를 마주하고 Spring Security에 대한 config에서 해당 API URI에 대한 요청을 permitAll()을 해줬지만, 여전히 403 Forbidden 에러를 발생했습니다.

그 이유는 바로 Spring Security가 기본적으로 CSRF 공격 방지 기능을 활성화하고 있기 때문이었습니다. 👍

CSRF는 Cross-Site Request Forgery의 약자로 사이트 간 요청 위조라는 웹사이트 취약점 공격의 하나입니다.
사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말합니다.

2008년 옥션에서 발생한 개인정보 유출 사건에서 사용된 공격 방식 중 하나입니다.

CSRF는 XSS 공격과 달리 특정 웹사이트가 사용자의 웹 브라우저를 신용하는 상태를 노리는 공격 방법입니다.

CSRF 공격 과정


1. 피해자가 은행 계좌에 로그인합니다.
2. 은행은 피해자에게 인증 토큰을 부여합니다.
3. 해커가 피해자에게 은행으로부터 합법적으로 온 것 같은 위조 요청을 보냅니다.
4. 피해자는 자신도 모르게 은행으로 요청을 전달합니다.
5. 피해자에게 부여된 인증 토큰을 사용하여 은행은 위조된 요청을 실행합니다.

CSRF 방어 방법

  1. 인증수단으로 쿠키를 사용하고 있다면 쿠키를 사용하지 않는 방식으로 변경하는 것입니다.
    세션 또는 쿠키의 경우는 CSRF 공격에 취약합니다.
    따라서, stateful한 서비스로 변경한다면 CSRF 공격이 먹히지 않습니다.
  2. Referrer 검증을 하는 방법이 있습니다.
    Host 정보와 Referrer 정보를 대조하여 판단합니다.
    CSRF 공격이 아니라면 자신의 서비스에서 API 흐름이 움직이기 때문에 Host와 Referrer가 같기 때문입니다.
  3. CSRF용 토큰을 통해 검증합니다.
    html 내부에 hidden 값으로 CSRF용 토큰을 준비하고 서버에 저장되어 있는 CSRF용 토큰와 같은지 비교하여 검증합니다.

저의 경우로는 인증 방법으로 JWT를 사용하고 있어 Spring에서 제공하는 CSRF 방어를 비활성화하는 것으로 403 Forbidden 문제를 해결했습니다.


참고

0개의 댓글