Spring/Spring Security

[Spring Security] 4-1. 보안: CSRF

noahkim_ 2023. 10. 6. 20:28

1. CSRF 공격이란?

  • 위조된 사이트에서 클릭을 통해 사용자가 의도하지 않은 요청을 특정 사이트로 전송하는 공격입니다.
  • 공격자가 피해자의 웹 브라우저를 통해 웹 사이트에 대한 위조된 요청을 생성하는 공격입니다.
  • 의도하지 않은 요청에 대한 인증은 브라우저의 쿠키정보를 사용하여 통과합니다.
    • 사용자의 쿠키정보가 브라우저에 남아있는 점을 이용합니다.

 

example

  • 사용자가 은행 웹사이트에서 이체 거래를 마쳤습니다.
  • 사용자는 메일 확인중, 모르는 자로부터 링크가 담긴 메일을 받았습니다.
    • 사용자는 경각심없이 메일의 링크를 클릭하였습니다.
  • 링크를 통해 이동한 웹 페이지에는 클릭만 하면 상품을 준다는 버튼이 있었습니다.
    • 사용자는 클릭을 하였습니다.
  • 이 버튼은 이전에 사용자가 사용했던 은행 웹사이트로 송금을 요청하는 버튼이었습니다.
    • 송금 요청은 인증된 사용자만 접근할 수 있는 보안 URL입니다.
    • 보안 URL을 접근하기 위해 사용자의 인증 정보가 같이 전송되어야 합니다.
  • 버튼은 사용자의 쿠키 정보에 인증정보가 들어있으며 브라우저에 남아있다는 점과 자바스크립트로 접근할 수 있다는 점을 노렸습니다.
    • 해당 자바스크립트 코드는 브라우저의 쿠키에 인증정보에 접근하여 요청시에 쿠키로 사용하여 인증을 통과하였습니다.
  • 이로인해 사용자는 악의적인 공격자에게 금액을 송금하는 피해를 받게 됩니다.

 

2. CSRF 방어

멱등성을 가진 안전 HTTP 메서드

  • CSRF 공격을 방지하기 위해 무상태 요청은 멱등성을 가져야 합니다.
  • 무상태 요청 : GET, HEAD, OPTIONS, TRACE

 

Synchronizer Token Pattern

  • HTTP 요청 시, HTTP 헤더에 랜덤한 보안 문자를 전송하는 방어기법
    • '_csrf' 라는 HTTP parameter 값으로 전송됩니다.
  • 서버 자신이 보관하고 있는 진짜 CSRF Token과 전송된 CSRF Token의 비교를 통해 유효성을 검증합니다.
  • CSRF Token은 브라우저에 보관되지 않습니다.
    • 보안을 위해 쿠키 형태로 보관되지 않습니다.
  • 상태 변경 요청에 한해 사용됩니다.
    • 보통 외부 링크 접속시 GET으로 접근하게 됩니다 
      • 외부 링크 접속은 수많은 요청이 들어올 수 있습니다.
      • 상태를 바꾸지 않는 요청인데도 이럴때마다 CSRF Token이 발급된다면 서버에 큰 부담을 줍니다.
    • Safe HTTP Method는 반드시 멱등성을 가져야 합니다.
      • 상태를 변경하는 요청일 때만 CSRF Token이 요구됩니다.

 

SameSite Attribute

  • 요청 쿠키에 대해 Site 제약을 두는 Cookie Attribute 입니다.
  • Strict
    • 반드시 동일한 출처로부터 요청이 들어와야 합니다.
  • Lax
    • 동일 출처 허용
    • 사용자가 주소창에 URL을 직접 입력하여 접속 허용
    • 외부 사이트의 링크를 클릭하여 접속 허용
  • 해당 속성을 통해 악의적인 공격자 사이트로부터의 요청이 효력을 잃습니다.

 

Content-Type 검증

  • CSRF 공격이 서버가 처리하는 폼 데이터의 Content-Type을 알지 못합니다.
  • 약속된 Content-Type으로 들어온 요청인지 검증함으로써 방어층을 추가하는 효과를 가질 수 있습니다. 

 

3. CSRF 고려사항

Login

  • 악의적인 공격자는 피해자에게 자신의 계정으로 로그인된 웹 사이트에 접속하도록 유도합니다.
  • 피해자는 로그인된 계정으로 웹 사이트를 방문하다가 자신의 민감정보를 제출하도록 유도받습니다.
  • 이를 위해 session timeout을 사용합니다.

 

Logout

  • 악의적인 공격자로부터 민감정보 노출 방지를 위해 강제적인 로그아웃이 필요합니다.
  • 이를 위해 session timeout을 사용합니다.

 

Session Timeout

  • CSRF Token은 session에 포함됩니다.
    • 이러한 경우 session이 만료되면 CSRF Token도 찾을 수 없습니다.
  • CSRF Token을 매 요청 직전에 따로 요청해서 응답받기
  • session이 곧 expired될 때, 사용자에게 알리기
  • CSRF Token을 쿠키에 저장하기
    • 공격자에 의해 접근이 가능하므로 여러 보안장치를 가져야 합니다.
    • 보안관련 쿠키 속성 사용하기

 

Multipart

  • Multipart request로부터 CSRF 공격을 방어하는데 문제가 있습니다.
  • CSRF Token을 Body에 둘 경우
    • CSRF Token을 읽기 위해 Body를 읽는 순간 Multipart 내용의 파일이 서버로 업로드됩니다.
  • CSRF Token을 URL에 둘 경우
    • 파일 업로드 문제는 예방할 수 있습니다.
    • 그러나 쿼리스트링에 둘 경우, CSRF Token이 노출됩니다.

 

 

참고