콘텐츠로 이동

2023 06 27

2023-06-27

CSRF

참고: https://junhyunny.github.io/information/security/spring-boot/spring-security/cross-site-reqeust-forgery/

  • 개요
    • CSRF(Cross-Site Request Forgery): 사이트 간 요청 위조
      • 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 웹사이트에 요청하게 하는 공격
      • 정상적인 사용자가 의도하지 않았음에도, 자신도 모르게 서버를 공격
      • 공격자가 만든 악성 페이지를 통해 사용자는 자신도 모르게 공격 수행
  • CSRF 전제 조건과 공격 과정
    • 전제 조건
      • 사용자가 보안이 취약한 서버로 부터 인증을 받은 상태일 것
      • 쿠키 기반으로 서버 세션 정보를 획득할 수 있을 것
      • 공격자는 서버를 공격하기 위한 요청 방법에 대해 미리 파악하고 있을 것
    • 공격 과정
      1. 사용자는 보안이 취약한 서버에 로그인
      2. 로그인 이후 sessionID가 사용자 브라우저 쿠키에 저장됨
      3. 공격자는 서버에 인증된 브라우저의 사용자가 악성 스크립트 페이지를 누르도록 유도
        • 악성 스크립트를 게시글로 작성해 게시글 클릭
        • 메일 등으로 링크 전달해 클릭 유도
      4. 쿠키에 담긴 sessionID를 통해 브라우저에 의해 서버로 요청
      5. 서버는 쿠키에 담긴 sessionID를 통해 사용자로 부터 요청왔구나~ 하고 처리
  • CSRF 방어 방법
    1. Referer 검증
      • 헤더 정보에서 host/referer 검증해서 유효한지 검사
      • 대부분 Referer 검증으로 가능함 (어디에서 요청이 왔는지를 검사하는 것만으로 괜찮은 듯)
    2. CSRF 토큰 검증
      • 요청하는 페이지에 hidden 타입의 input 태그를 이용한 토큰 값을 함께 전달