CSRF Token

DATE : 2024/1/18

공격자가 어떤 방식이든 사용자가 서버로 요청을 보내도록 하기 위해서는

그 요청이 완벽하게 만들어져야 한다고 했다.

CSRF 공격을 막기 위해서는 예시에서 살펴본 password_old parameter와 같이 공격자는 모르는,

인증 목적의 값을 사용하게 되는 데 이걸 CSRF Token이라 한다.

마이페이지에 비밀번호를 수정하는 기능이 있다고 가정해 보자.

서버에서는 사용자에게 마이페이지를 보내줄 때 그 안에 CSRF Token을 숨겨서 같이 보내준다고 한다.

<input type='hidden' name='csrf_token' value='__CSRFTOKEN__'>

CSRF Token이 들어 있는 페이지를 받아 수정할 비밀번호를 입력하면

"사용자가 입력한 비밀번호로 수정해줘!"라고 요청을 보낼 때,

http://pasword-change.com/?password_new=1019&csrf_token=__CSRFTOKEN__

페이지에 숨어있던 CSRF Token 또한 같이 보내게 된다.

이때 서버는 자신이 가지고 있는 CSRF Token 정보와 사용자가 보낸 Token을 비교해

자신이 발행한 토큰이 맞는지, 이 사용자가 유효한(인증된) 사용자인지 검증하는 과정을 거친다.

CSRF Token은 사용자가 비밀번호를 바꿀 권한이 있는지 인증하기 위한 데이터라 할 수 있고 💡

보통 1회 용으로 마이페이지에 접속할 때마다 새롭게 발행되는 랜덤한 값이기 때문에

비밀번호 수정 요청을 보내기 위해서는 이 값이 필요하지만 예측하기 쉽지 않다.

따라서 CSRF Token 이라는 인증과 관련된 데이터를 URL에 포함하게 되면

비밀번호를 수정하기 위해서 반드시 필요한 데이터지만 공격자는 모르는 값이기 때문에

URL을 완성하지 못하는 공격자는 CSRF 공격을 수행할 수 없다..!

여기까지 보면 CSRF Token을 사용하면 완전 무장할 수 있겠는데?? 싶지만

CSRF Token을 탈취할 수 있다면 얘기가 달라진다..!!

이해를 돕기 위해 CSRF Token을 사용하는 경우,

Token을 탈취해 CSRF 공격을 수행하는 예시는 CTF3을 통해 알아보도록 하자. 🤗

Last updated