1. 들어가며
웹 개발을 하다 보면 CORS (Cross-Origin Resource Sharing) 오류나 CSRF (Cross-Site Request Forgery) 보안 이슈를 마주할 때가 있다. 이 두 가지는 브라우저 보안 정책과 관련이 있으며, 이를 올바르게 이해하고 처리하지 않으면 예상치 못한 문제를 일으킬 수 있다.
이번 글에서는 CORS와 CSRF의 개념, 발생 원인, 해결 방법을 정리하여 어떻게 대응하면 좋은지 살펴보겠다.
2. CORS(Cross-Origin Resource Sharing)
Cross-Origin: 교차 출처 (= 다른 출처)
도메인이 다른 서버끼리 리소스를 주고 받을 때 보안을 위해 설정된 정책이다.

📌 예시
- 웹사이트 A가 API 서버 B에서 데이터를 가져오려 할 때, API 서버 B에서 CORS 허용 설정이 없으면 웹 브라우저에서 API 접근이 거부될 수 있다.
- React(3000 포트)와 Spring Boot(8080 포트)를 따로 실행하면, 서로 다른 출처로 판단되어 CORS 오류가 발생한다.
💡 CORS 오류가 발생하는 이유는?
브라우저의 보안 정책으로 인해 발생한다. 브라우저는 동일 출처 정책(Same-Origin Policy)을 따르기 때문에, 자원이 요청된 출처(도메인, 프로토콜, 포트)가 현재 웹 페이지와 다를 경우 요청을 차단한다.
→ 이때 서버에서 적절한 CORS 헤더를 설정하지 않으면 오류가 발생한다.
💡 앱에서도 CORS 오류가 발생할까?
CORS는 브라우저의 보안 정책이므로, 웹에서만 발생한다. 앱은 브라우저를 통하지 않고 API 요청을 직접 보내므로 CORS 문제가 발생하지 않는다.
3. CORS 해결 방법
✅ 서버에서 CORS 설정 추가
@CrossOrigin(origins = "https://example.com")
@RequestMapping("/api")
@RestController
public class ApiController {
// API 메서드 구현
}
✅ 전역 CORS 설정
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com")
.allowedMethods("*");
}
};
}
}
4. CSRF(Cross-Site Request Forgery)
사용자가 인증된 상태에서, 공격자가 사용자의 권한을 이용해 원하지 않는 동작을 수행하게 하는 공격

📌 문제 발생 시나리오
- 사용자가 로그인된 상태
- 악성 웹사이트 방문
- 자동으로 요청 전송
💡 CSRF 공격이 가능한 이유
사용자가 로그인된 상태에서 다른 웹사이트가 사용자의 세션을 도용할 수 있기 때문이다.
5. CSRF 해결 방법
🛡️ CSRF 방어 방법
- CSRF 토큰 – 각 요청에 대한 고유한 토큰을 발급하고, 이를 확인
- Referer 검사 – 요청의
Referer헤더를 확인 - SameSite 쿠키 속성 – 동일 출처에서만 쿠키가 전송되도록 설정
💡 Spring Security와 JWT 사용 시 CSRF 문제 해결
https://docs.spring.io/spring-security/site/docs/5.3.x/reference/html5/#csrf
Spring Security Reference
In Spring Security 3.0, the codebase was sub-divided into separate jars which more clearly separate different functionality areas and third-party dependencies. If you use Maven to build your project, these are the modules you should add to your pom.xml. Ev
docs.spring.io
Spring Security에서 제공하는 CSRF protection 기능을 무조건 Enable 하는 것을 권장한다.
→ 하지만, 만약 CSRF에 취약하지 않은 환경이라면 무조건 Enable 해야 하는가?
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // JWT를 사용하면 CSRF 방어가 필요 없음
}
}
SPA(Single Page Application) 방식으로 개발된 (REST) API 서버는 해당 기능을 disable해도 된다.
- REST API 서버는 stateless하게 개발하기 때문에 사용자의 정보를 세션에 저장하지 않는다.
- 일반적으로 JWT 토큰을 사용하여 인증하기 때문에 해당 토큰을 쿠키에 저장하지 않는다면 CSRF 취약점에 대해서 안전하다고 말할 수 있다.
💡 앱인 경우에도 CSRF 문제가 발생하는가?
앱의 경우, 사용자가 앱 내에서만 동작하기 때문에 악성 웹사이트를 방문할 가능성이 적다. 하지만 가능성은 있다.
Spring Security와 JWT 방식을 사용한다면 상관없다.
6. 결론
✅ CORS
- 웹 브라우저 보안 정책으로 인해 발생
- 서버에서 CORS 헤더를 설정하면 해결 가능
✅ CSRF
- 로그인된 사용자의 세션을 도용하는 공격
- CSRF 토큰, SameSite 쿠키 설정 등을 활용해 방어 가능
웹 보안 이슈는 서비스를 안전하게 보호하기 위한 필수적인 요소다. CORS와 CSRF의 개념을 정확히 이해하고 적절한 보안 정책을 적용한다면, 보다 안전한 웹 서비스를 운영할 수 있을 것이다.
