본문 바로가기
웹(web)

csrf 이란

by 바코94 2024. 5. 2.


csrf(cross-site request forgery)란 공격자가 웹 보안 공격 중 유저가 의도하지 않은 행동을 하게 하는 것인데, 다음 세 가지 조건을 만족해야 성립한다.
1. 공격자가 의도한 행동이 어플리케이션 안에서 일어난다.
2. 쿠키 기반 세션을 사용하는 어플리케이션이어야 한다.
3. 어플리케이션 개발자가 예측하지 못한 요청 파라미터여야 한다.

간단하게 예를 들면 쿠키 기반 세션을 가진 웹 어플리케이션이라면, 로그인 인증이 되면 클라이언트 측 쿠키에 세션 유지를 목적으로 특정한 값(세션 키 등) 저장하여 사용할 수 있다. 이후 클라이언트<->서버 간의 통신 간 쿠키에 세션 인증이 되는 값이 있기 때문에 별도의 인증 없이도 권한에 대한 인증이 통과된다. 
my-website.com 사이트에서 비밀번호 변경시 /password/change에 POST 요청으로 변경을 한다고 해보자.

POST /password/change HTTP/1.1
Host: my-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Cookie: session=yvthwsztyeQkAPzeQ5gHgTvlyxHfsAfE

password=new-password


api 요청을 활용한 일반적인 비밀번호 변경 방식이다. 

이 사이트에 쿠키 값이 저장된 유저가 다음과 같은 html을 읽으면 어떻게 될까? (이해하려면 html, javascript 지식이 필요하다.)

<html>
    <body>
        <form action="https://my-website.com/password/change" method="POST">
            <input type="hidden" name="password" value="csrf-success" />
        </form>
        <script>
            document.forms[0].submit();
        </script>
    </body>
</html>

 

브라우저에는 쿠키 값에 세션키가 저장되어 있고, my-website.com/password/change 라는 url 로 POST 요청이 날라가게 되어 비밀번호가 "csrf-success" 로 변경되게 된다. my-website.com 서비스를 이용하는 유저가 위 html 내용이 있는 메일을 읽게 된다면? 자신의 비밀번호가 csrf-success로 변경되어 있을 것이다. 

csrf 공격의 핵심은 요청에 대한 인증이 계속 허용되어 있기 때문에 유저가 의도하지 않았음에도 요청만 날라가면 공격이 성공한다는 점이다.

굉장히 단순하면서도 강력한 방법이다. csrf 을 막기 위한 방법은 여러 가지가 있는데, 상황에 맞게 적용하면 된다. 요즘의 웹 서비스에서는 비밀번호 변경시 2차 인증 쓰는 곳이 많은 것 같다.

에이 이런 간단한 거에 누가 당하겠어? 하지만 이미 많은 대기업들이 취약점 때문에 해킹된 사례들이 있고 앞으로도 더 생길 것이다. 

참고: https://portswigger.net/web-security/csrf

'웹(web)' 카테고리의 다른 글

웹 어플리케이션 성능 최적화  (0) 2024.06.15
소수점을 표현하는 방법  (0) 2024.05.08
springboot hot reload 방법 참고 링크  (0) 2024.03.08
크롬을 이용한 프론트엔드 디버깅  (0) 2022.04.22
테스트 코드  (0) 2022.01.06