-
CSRF에 대해서 파헤치기웹 보안 2024. 8. 24. 13:47
오늘은 CSRF의 개념과 예시, 그리고 방지 방법을 알아보겠습니다.
공부한 내용을 정리하는 글로 부정확한 서술이나 전문성이 부족할 수 있습니다.
CSRF란?
CSRRF는 Cross-Site Request Forgery로, 웹 어플리케이션의 취약점을 이용해 사용자가 원하지 않은 요청을 보내도록 하는 공격 기법입니다. 공격자는 사용자가 인증된 상태를 악용하여 사용자가 원하지 않는 행동을 수행하게 만듭니다. 예를 들어, 사용자가 로그인된 상태(은행 사이트)에서 악의적인 웹사이트를 방문하면, 그 웹사이트가 사용자의 권한을 이용해 은행 계좌에서 돈을 송금하도록 할 수 있습니다.
저는 처음에 잘 이해가 가지 않았던 부분입니다. 브라우저를 사용하는 사용자가 어떻게 다른 사람의 의도가 담긴 요청을 자신도 모르게 보낼 수 있는 걸까요? 예시를 보면서 이해해 보도록 합시다.
제가 CSRF 개념을 보면서 들었던 의문점들을 먼저 적겠습니다.
1. CSRF가 통하는 웹 애플리케이션의 취약점은 어떤 것일까?
2. 공격자는 어떻게 사용자의 인증된 상태를 자기 마음대로 이용할 수 있을까?
3. 공격자는 어떻게 사용자가 의도하지 않은 요청을 보낼 수 있게 하는 걸까?
CSRF 상황
1. 사용자가 로그인: 사용자가 웹 애플리케이션에 로그인합니다.
2. 세션 유지: 로그인 후 세션 쿠키가 브라우저에 저장됩니다.
3. 악성 웹사이트 방문: 사용자가 다른 웹사이트를 방문합니다. 이 웹사이트는 CSRF 공격 코드를 포함하고 있습니다.
4. 악의적인 요청 전송: 악성 웹사이트는 사용자의 세션 쿠키를 이용해 원본 웹 애플리케이션으로 요청을 보냅니다.
5. 서버 요청 처리: 서버는 요청을 정상적인 사용자의 요청으로 인식하고 요청을 처리합니다.
해결된 궁금증
2. 공격자는 어떻게 사용자의 인증된 상태를 마음대로 이용할 수 있을까?
- 사용자가 웹 애플리케이션에 로그인하면 로그인 세션 정보가 담긴 쿠키를 사용자의 컴퓨터에 저장합니다. 공격자는 CSRF 공격 코드를 이용해 사용자의 로그인된 상태에서 위조된 요청을 인증된 웹 애플리케이션에 보내게 됩니다. 이렇게 되면 서버 입장에서는 요청을 보낸 사용자가 공격자의 컴퓨터가 아닌 사용자의 컴퓨터에서 보냈으므로, 요청을 정상 처리하는 것입니다.
3. 공격자는 어떻게 사용자가 의도하지 않은 요청을 보낼 수 있는 걸까?
<!DOCTYPE html> <html> <body> <h1>Free Gift</h1> <img src="http://bank.com/transfer?amount=1000&to=attacker" style="display:none;" /> </body> </html>
사용자는 위의 예시와 같은 공격자의 악성 웹사이트에 접속할 경우, 이미지 태그 안에 있는 링크로 요청을 보내게 됩니다. 위의 링크는 HTML Form을 기반으로, Form 방식은 url에 쿼리파라미터(Get요청) 또는 HTML Form 바디에 쿼리파라미터(Post요청)에 값을 넣어주는 형식입니다. 물론, 사용자가 로그인하지 않았다면 위의 요청은 reject되겠지만 100번 로그인 하지 않다가 딱 1번만이라도 로그인 했을 경우 이 요청이 정상적으로 처리되는 겁니다.
CSRF에 대처할 수 있는 웹 애플리케이션 레벨의 방지 방법은 아래와 같습니다.
1. Referer 헤더 검증
2. CSRF 토큰 사용
3. form 대신 API 사용
1. Referer 헤더 검증
서버는 요청의 Referer 헤더를 확인하여 요청이 신뢰할 수 있는 출처에서 온 것인지 확인할 수 있습니다. 그러나, Referer 헤더는 사용자가 조작할 수 있고, 일부 브라우저에서는 이 헤더를 포함하지 않을 수 있습니다. Rerferer 헤더는 웹 브라우저나 웹 애플리케이션에서 웹페이지 요청 시 해당 요청이 어디서 발생했는지를 나타내는 정보입니다.
2. CSRF 토큰 사용
가장 일반적인 방지 방법으로, 서버는 각 요청에 대해 고유한 토큰을 생성하고, 이를 폼에 포함시킵니다. 이를 폼에 포함시킵니다. 서버는 요청이 들어올때 이 토큰을 검증합니다. Spring에서는 Spring Security에 SecurityFilterChain의 .csrf옵션을 조작하면 가능합니다.
3. form 대신 API 사용
API를 통해 JSON 데이터로 통신한다면 해당 이슈를 피할 수 있습니다.
해결된 궁금증
1. CSRF가 통하는 웹 애플리케이션의 취약점은 어떤 것일까?
- CSRF가 통하는 웹 애플리케이션의 취약점은 HTTP form을 기반으로 요청을 처리할 때 주로 발생합니다.
웹 보안은 이해를 하면 할 수록 개발자가 신경써줘야하는 부분이 많다고 생각합니다. 최대한 많은 공격에 대해 배워서 안전한 웹 애플리케이션을 제공할 수 있도록 해야할 것입니다.
'웹 보안' 카테고리의 다른 글
CORS에 대해 쉽고 빠르게 파헤치기 (0) 2024.08.19