본문 바로가기

SPRING SECURITY

CSRF란?

CSRF란?

사이트 간 요청 위조 (Cross-site Request Forgery)

 

웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청하게 하는 공격을 말한다.  -위키피디아-

공격 시나리오

예시를 들기 위해 티스토리 블로그를 사용한다는 가정을 하겠습니다.

 

티스토리 게시물 작성 URL은

POST방식의 www.tistory.com/write?title=abcd&content=1234 이라고 임의로 정하겠습니다.

 

1. 사용자는 티스토리에 접속하여 세션 ID를 발급받은 후  로그인을 성공해 줍니다.

 

  • 로그인을 성공하게되면 해당 세션 ID를 이용하여 위에서 정한 게시물 작성 URL을 통해 게시글 작성이 가능해질 것입니다.

2. 공격자는 사용자에게 이메일 보내거나, 사용자가 직접 올린 게시글에 접속하도록 유도합니다.

 

  • 공격자에 의해 만들어진 이메일 혹은 게시글에 접속하게 되면, 이미지 태그로 된 티스토리 게시글 작성 URL이 있어 브라우저는 이미지 파일을 받아오기 위해 자동적으로 URL이 실행될 것입니다.
  • 이미지는 크기를 0으로 만들면 보이지 않기 때문에 잘 알아차리지 못합니다.

3. 이미 해당 브라우저를 통해 티스토리에서 인증을 받은 사용자는 이미지 태그의 URL의 티스토리 게시글 작성 URL이 정상적으로 작동될 것입니다.

 

4. 그러면, 사용자의 아이디를 통해 의도하지 않은 게시글이 작성이 될 것입니다.

 

※CSRF 공격 실습 과정 보기

https://swk3169.tistory.com/24

 

CSRF 대응 방안

1. CSRF Token 사용하기

사용자가 로그인시 그리고 작업화면 요청 시 세션에 임의의 난수로 값을 저장하고 사용자에게 넘겨줍니다. 이것이 CSRF Token이 될 것입니다. 

 

  • 토큰이 필요하면 화면(로그인, 글쓰기)에 접속을 시도할 때마다 토큰을 만들어 주어야 합니다.

그리고 작업화면에서 요청을 할 때 CSRF Token값을 같이 서버로 전송하게 되는데, 서버에서는 이 Token값이 세션에 저장된 값과 일치하는지 확인하여 해당 요청이 위조된 것이 아니라는 것을 확인을 해야 합니다.

 

  • 예를 들어 글쓰기 화면에 접속 시 CSRF Token을 받고, FORM태그를 통해 TITLE, CONTENT 및 CSRF Token도 전송합니다.
  • 위의 공격 시나리오에서는 세션에 대한 CSRF Token값과 공격자 사이트를 통해 전송 된 URL의 CSRF Token이 일치 하지 않거나,  없을 수 있기 때문에 공격 성곡 확률이 떨어집니다.

일치 여부를 확인한 Token값은 바로 폐기하고 새로운 로그인 혹은 작업화면의 요청이 들어올 때마다 새로 생성하여 발급해줍니다.

2. Referrer 검증

같은 도메인에서 들어오는 접속은 허용하나, 엉뚱한 도메인을 통해서 호출 시에는 차단하는 개념입니다.

3. CAPTCHA 사용

어떠한 사용자가 실제 사람인지 컴퓨터 시스템인지 구별하기 위해 사용되는 방법입니다.

 

참고

https://swk3169.tistory.com/24

https://m.blog.naver.com/lstarrlodyl/221943397270

https://codevang.tistory.com/282