[csrf] 란?

송채영·2023년 7월 20일

csrf : CSRF란, Cross Site Request Forgery의 약자로, 한글 뜻으로는 사이트간 요청 위조를 뜻합니다.
CSRF는 웹 보안 취약점의 일종이며, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(데이터 수정, 삭제, 등록 등) 을 특정 웹사이트에 요청하게 하는 공격입니다.
예를 들어, 피해자의 전자 메일 주소를 변경하거나 암호를 변경하거나 자금이체를 하는 등의 동작을 수행하게 할 수 있습니다.
특성에 따라, 공격자는 사용자의 계정에 대한 완전한 제어권을 얻을 수 있을 수도 있습니다.

  • cookie & session
    사용자가 특정 서버에 로그인하면 일반적으로 다음과 같은 작업들이 수행됩니다.
  1. 서버는 로그인 시 인증된 사용자의 정보를 세션(session)에 저장하고, 이를 찾을 수 있는 sessionID을 만듭니다.
  2. 서버는 저장된 세션 정보를 클라이언트(브라우저)가 사용할 수 있도록 sessionID를 Set-Cookie 헤더에 담아서 전달합니다.
  3. 클라이언트(브라우저)는 전달된 sessionID를 쿠키에 저장합니다.
  4. 클라이언트(브라우저)는 해당 도메인을 가진 서버로 요청 시 쿠키에 저장된 sessionID를 자동으로 전달합니다.
  5. 서버는 쿠키에 담긴 sessionID를 통해 인증된 사용자인지 여부를 확인합니다.
  • 동작원리
  1. 사용자는 보안이 취약한 서버로부터 이미 로그인되어 있는 상태여야 합니다.
  2. 쿠키 기반의 서버 세션 정보를 획득할 수 있어야 합니다.
  3. 공격자는 서버를 공격하기 위한 요청 방법에 대해 미리 파악하고 있어야 합니다.
    예상하지 못한 요청 매개변수가 없어야 합니다.

CSRF 방어방법 - 사용자 입장

사용자 입장에서는 이상한 URL 을 함부로 클릭하지 않고, 의심이 되는 메일을 열어보지 않는것이 중요합니다. CSRF는 클릭만해도 바로 내가 의도하지 않은 action이 수행될 수 있기 때문입니다.

CSRF 방어방법 - 웹개발자/운영자 입장

  1. Referer check (리퍼러 체크)
    HTTP 요청 헤더(request header) 정보에서 Referrer 정보를 확인할 수 있습니다.
    보통이라면 호스트(host)와 Referrer 값이 일치하므로 둘을 비교합니다.
    CSRF 공격의 대부분 Referrer 값에 대한 검증만으로도 많은 수의 공격을 방어할 수 있다고 합니다.
    Java servlet을 사용하신다면 아래와 같이 intercepter 클래스를 만들어서 모든 요청에 대해 referer check 할 수 있도록 방어가 가능합니다.

  2. CAPTCHA 도입
    요청시에 CAPTCHA 를 이용하여, CAPTHCA 인증코드가 없거나 틀리면 요청을 거부하도록 할 수 있습니다.

  3. CSRF 토큰사용
    사용자 세션에 임의에 값을 저장하여 모든 요청마다 해당 값을 포함하여 전송하도록 합니다.
    서버에서 요청을 받을때마다, 세션에 저장된 값과 요청으로 전송된 값이 일치하여 검증하여 방어하는 방법입니다.

profile
성장하는 개발자. (backend, ai)

2개의 댓글

comment-user-thumbnail
2023년 7월 20일

글 잘 봤습니다, 많은 도움이 되었습니다.

1개의 답글