[csrf] 란?

송채영·2023년 7월 20일
0

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

2개의 댓글

comment-user-thumbnail
2023년 7월 20일

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

1개의 답글