![[보안] CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKo4g2%2FbtsOe6LsPLQ%2FENaFlsDkgIiNikVd6t2jDK%2Fimg.jpg)
[보안] CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)네트워크/보안2025. 5. 28. 11:11
Table of Contents
CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조)는 사용자가 자신의 의지와 무관하게 원하지 않는 요청을 보내도록 만드는 공격 기법이다.
간단하게 말하면, 사용자가 로그인한 상태를 악용해서 악성 사이트가 사용자의 권한으로 공격 요청을 보내게끔 유도하는 방식이다.
또한 기본적으로 쿠키를 사용하지 않는다면 CSRF 공격을 대비할 필요는 없다.
예시
- 사용자가 A사이트(예: 은행)에 로그인하고, 세션 쿠키가 브라우저에 저장되어 있음.
- 사용자가 로그아웃하지 않은 상태에서 다른 악성 사이트 B를 방문함.
- B 사이트는 <img src="https://bank.com/transfer?amount=10000&to=attacker"/> 와 같은 요청을 자동으로 보냄.
- 브라우저는 bank.com에 이미 로그인 되어 있으므로, 해당 요청에 세션 쿠키를 자동으로 붙여 전송함.
- 결과적으로 사용자는 모르는 사이에 10,000원을 공격자에게 보냄.
이런 공격이 가능한 이유는 브라우저는 같은 출처의 요청이든 다른 출처의 요청이든 쿠키를 자동으로 함께 전송하기 때문이다.
즉, 사용자가 요청을 보낸 게 아니더라도, 로그인된 상태라면 인증정보가 함께 전송되어버린다.
CSRF 방어 방법으로 가장 기본적인것은 CSRF 토큰을 사용하는 것이다.
아래는 Spring Security와 Thymeleaf를 함께 사용할 때 예시이다.
Thymeleaf
<form method="POST" action="/api/doSomething">
<input type="hidden" name="_csrf" th:value="${_csrf.token}">
<!-- 그 외 입력 값들 -->
</form>
Spring Security
스프링 시큐리티는 기본적으로 CSRF 보호 기능이 활성화되어 있다.
만약 REST API 서버라면 다음과 같이 비활성화하는 경우가 일반적이다.(쿠키를 일반적으로 사용하지 않기 때문)
http
.csrf().disable(); // 상태 없는 API는 일반적으로 disable
'네트워크 > 보안' 카테고리의 다른 글
[보안] CSP(Content Security Policy) (0) | 2025.05.28 |
---|---|
[보안] SOP와 CORS (0) | 2025.05.27 |
[보안] JWT(Json Web Token) (0) | 2025.05.27 |