CSRF 공격과 토큰

charco·2021년 6월 4일
0

공부하는 중 정리하는 글이기 때문에 정보에 오류가 있을 수 있습니다.
틀린 부분 있다면 정정해주시면 감사하겠습니다.

CSRF??

CSRF 는 줄여서 Cross-site request forgery이다.
번역하면 '사이트 간 요청 위조'다.
그니까 사이트 사이의 요청을 위조하는건가?
쉽게 와닿지 않는다.


다른 출처로부터의 요청

이럴때는 쉽게 예를 들어보자.
당신이 html 페이지를 만들었다고 치자.
그 페이지에는 당신의 네이버 블로그의 글쓰기 페이지로 가는 a태그가 있다.

이제 당신은 최소 두가지 방법으로 블로그의 글쓰기 페이지에 접근해 글을 쓸 수 있다
1.네이버에서 당신의 블로그에 들어가 글쓰기 버튼을 누르고 글을 쓴다.
2.당신이 만든 html에서 바로 글쓰기 버튼을 누르고 글을 쓴다.

두번째 방법은 당신이 이미 네이버에 로그인돼있다는 전제 하에 가능하다.
그리고 로그인만 돼있다면 어느곳에서나 글쓰기의 uri 요청을 하면
접근 가능하다.
이 말은 해당 서버는 당신이 어디서 요청을 하던지 신경쓰지 않는다는 것이다.
사실 이 얘기는 보안에 아무 관련이 없지만 설명을 위해 적었다.


CSRF 공격

그러나 당신이 어떤 사이트의 관리자(admin)권한을 갖고 있고
간단한 uri 요청으로 타인에게 권한을 부여할 수 있다고 해보자.

ex) /update?grade=admin&account=chan

chan이라는 계정에 admin 권한을 부여하는 것이다.
이것은 블로그 글쓰기와는 달리 타인에게 높은 권한을 줌으로써
탈취되면 위험할 수 있는 정보까지 접근하도록 할 수 있다.

공격자 chan은 당신에게 이 url 을 호출하도록 유도해 자신이 admin 권한을 얻으려고 한다. 어떻게 유도할까?
당신의 이메일에 위의 uri를 심어 보내거나 자주 방문하는 사이트에 심어놓을 수 있다. 방법은 다양하다.

그러면 당신은 자신도 모르는 사이에 uri를 요청해 공격자 chan에게 권한을 부여한다. chan은 얻은 권한으로 공격에 성공한다.

이제 사이트 간 요청 위조가 무슨 말인지 감이 잡힐 것이다.

CSRF 공격은 서버가 요청이 어디서부터 왔는지 따지지 않기 때문에 성공한 것이다.


CSRF 토큰

그러면 서버는 요청이 적절한 곳에서 오는지 확인해야 한다.
그때 사용되는 것이 CSRF 토큰이다.

서버는 브라우저에 데이터를 전송할때 CSRF토큰을 같이 전송한다.
사용자가 POST방식 등으로 특정한 작업을 할 때는 브라우저에서 받은 CSRF 값과 서버가 보관하고 있는 CSRF 값을 비교한다. 값이 다르면 요청을 처리하지 않는 방식이다.

CSRF토큰은 발행되고 요청을 받아 유효한지 확인 후 작업이 처리되면
기존의 것을 바로 폐기하고 새로 발행해서 사용자에게 보낸다.
이와 같이 수시로 변하기 때문에 공격자는 공격에 성공하기 어렵다.

CSRF 토큰은 대충 이렇게 생겼다.
3bc62781-220d-4f41-a4f0-f6d10ef9a626

profile
아직 배우는 중입니다

0개의 댓글