[Spring Security] CSRF 공격 방식과 그 해결 방법

정민규·2024년 12월 10일
0

CSRF(Cross-Site Request Forgery)

사이트 간 공격 위조라 불리는 이 공격 방식은, 사용자로 하여금 자신의 의지와 관계 없이 특정 웹페이지에 공격자가 의도한 행동을 하도록 만드는 공격 방식이다.

'공격자가 의도한 행동'의 대표적인 예시로는 다음과 같은 행동들이 있다.

  • 은행 웹 사이트에게 특정 계좌번호로 자신의 돈을 송금.
  • 특정 웹 사이트의 비밀번호를 공격자가 원하는 비밀번호로 변경.
  • 특정 웹 사이트에 각종 데이터의 수정, 삭제, 등록 요청을 위조.

CSRF 공격 과정

  1. 사용자가 공격 대상이 될 웹사이트에 로그인한다.

  2. 웹 사이트는 해당 사용자의 로그인을 승인하고 세션 쿠키를 사용자에게 건네준다.
    이 세션 쿠키는 사용자의 웹 브라우저 안에 저장된다.

  3. 사용자가 로그아웃 하지 않은 채로 공격자가 만든 악성 스크립트 페이지에 접속한다.

  4. 악성 페이지에는 공격 대상이 될 사이트에게 악의적 요청을 하는 폼이 준비되어 있고, 이를 사용자가 누르도록 유도한다.

  5. 사용자가 해당 폼을 통해 요청을 하게 되면, 자동적으로 사용자의 브라우저에 저장된 세션 쿠키 값이 함께 전달되고, 공격 대상 서버는 해당 요청을 정상적인 사용자로부터 온 요청이라 판단하고 처리한다.

3, 4번 과정에서 사용자가 공격자의 악성 사이트에 접속해 폼 요청을 누르게 하는 방법은 다양하다.
(예 : 스캠 메일에 악의적인 링크를 포함시키기, 커뮤니티 게시글이나 댓글에 악의적 링크를 포함시키기 등등...)

CSRF 공격의 필요 조건

위의 CSRF 공격의 과정을 살펴보았을 때, 이 공격을 수행하기 위해서 필요한 조건들을 몇가지 찾을 수 있는데, 다음과 같다.

  1. 사용자는 공격 대상이 되는 웹 사이트에서 로그아웃 하지 않은 상태여야 한다.
    사용자가 로그아웃 한 상태라면 세션 쿠키 값이 만료되기 때문에 해당 값을 가지고 위조된 요청을 하더라도 서버로부터 거부당한다.

  2. 공격자는 사용자의 웹 브라우저에 저장된 세션 정보가 담긴 쿠키에 엑세스할 수 있어야 한다.

  3. 공격자는 공격 대상이 될 웹 사이트에 요청을 보내는 방법에 대해 미리 알고 있어야 한다.
    요청 방식이 잘못되면 당연히 서버로부터 거부당하기 때문.

CSRF 토큰을 이용한 CSRF 공격 방어

  1. 서버는 클라이언트의 요청을 받을 때마다 CSRF 토큰을 생성하고 이를 세션에 저장한다.
    그리고 해당 토큰 값을 클라이언트에게 전달한다.
  • 서버에서 HTML을 렌더링하여 클라이언트에게 보내는 경우, HTML의 meta 태그, 혹은 form 태그_csrf 필드를 집어넣는다.

  • Restful 서버에서는 따로 HTML 문서를 클라이언트에게 보내지 않으므로, CSRF 토큰 획득을 위한 별도의 API를 클라이언트에게 제공한다.

  • 쿠키를 통해 CSRF 토큰을 클라이언트에게 전달한다.

  1. 클라이언트는 모든 Post, Put 요청에 대해서 직전에 발급받은 CSRF 토큰 값을 함께 제시한다.

  2. 서버는 클라이언트로부터 받은 토큰과 세션에 저장해 놓은 토큰값을 대조하여 해당 클라이언트의 요청을 허용할지 여부를 결정한다.

공격자는 사용자 브라우저에 저장되어 있는 CSRF 토큰값 까지는 읽어낼 수 없기 때문에 사용자가 악성 웹 사이트에서 폼을 제출하더라도 토큰 값이 없기 때문에 서버 단에서 거절당하게 된다.

profile
조금이더라도 꾸준하게.

0개의 댓글

관련 채용 정보