개인공부
CORS(Cross Origin Resource Sharing)
개바리여리
2024. 10. 9. 22:29
CORS
Cors: Cross origin resource sharing 이라고 부른다. cors를 알아보기전 SOP(same origin policy)에 대해 알아야 한다.
여기서 origin이란 "https://도메인주소:443" 을 부른다 url에서 path부분을 제외한 것
똑같은 origin끼리만 데이터 송수신이 가능한 것을 sop라고 부른다.
악의적인 사용자가 하이채킹을 통해 정보를 빼가는 것을 방지하기 위해 도입된다.
*하이재킹: 하이재킹(Hijacking)은 원래 사용자가 의도한 통신이나 세션을 가로채서 공격자가 불법적인 목적으로 제어하는 사이버 공격 방식
다른 origin끼리의 통신일때 Cors가 발생하는 것이다.
즉 COCRS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 애플리케이션에서 다른 출처(도메인, 프로토콜, 포트)에 있는 리소스를 요청할 때 발생하는 보안 메커니즘입니다.
CORS 동작 방식:
- 프리플라이트 요청(Preflight Request): 브라우저는 교차 출처 요청을 하기 전에 OPTIONS 메서드를 사용해 서버에 사전 요청을 보냅니다. 이 프리플라이트 요청을 통해, 브라우저는 실제 요청을 보내도 되는지 확인합니다.
- 서버의 응답: 서버가 올바른 CORS 헤더를 포함하여 응답하면 브라우저는 실제 요청을 수행합니다.
- CORS 헤더:
- Access-Control-Allow-Origin: 교차 출처를 허용할 도메인을 지정합니다. (예: *로 설정하면 모든 도메인 허용)
- Access-Control-Allow-Methods: 허용할 HTTP 메서드 (예: GET, POST, PUT, DELETE 등)
- Access-Control-Allow-Headers: 허용할 커스텀 헤더 목록
서버는 적절한 CORS 헤더를 설정하여 클라이언트의 교차 출처 요청을 허용할 수 있습니다. 이를 통해 서버에서 명시적으로 어떤 출처에서 오는 요청을 허용할지 결정합니다.
설정방법: (전역설정, 스프링부트 기준)
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 모든 URL에 대해 CORS 적용
.allowedOrigins("http://example.com") // 허용할 출처 (특정 출처)
.allowedMethods("GET", "POST", "PUT", "DELETE") // 허용할 HTTP 메서드
.allowedHeaders("*") // 허용할 헤더
.allowCredentials(true); // 자격 증명(쿠키 등) 허용
}
}
- addMapping("/**"): 모든 엔드포인트에 대해 CORS 설정을 적용.
- allowedOrigins("http://example.com"): 특정 출처를 허용. (*로 설정하면 모든 출처 허용).
- allowedMethods("GET", "POST", ...): 허용할 HTTP 메서드를 지정.
- allowCredentials(true): 인증 정보(쿠키, 헤더 등)를 포함한 요청 허용 여부.
특정 컨트롤러 설정:
@RestController
public class ApiController {
@CrossOrigin(origins = "http://example.com") // 특정 출처 허용
@GetMapping("/api/data")
public String getData() {
return "CORS 설정 적용됨";
}
}
@CrossOrigin(origins = "http://example.com"): 특정 출처에서 오는 요청만 허용. origins = "*" 로 설정하면 모든 출처 허용.