Cross Origin Resource Sharing
CORS는 웹 개발에서 중요한 주제로, 동일 출처 정책(Same-Origin Policy)의 한계를 해결하기 위해 고안된 메커니즘이다. Django로 웹 서비스를 구현할 때도, Flask로 앱을 구성하고 연동할 때도 다뤄 보았으나 제대로 알아 본 적은 없었기에, 이번 기회에 조사해보고자 한다.
CORS(Cross-Origin Resource Sharing)는 브라우저에서 실행되는 웹 애플리케이션이 자신의 도메인이 아닌 리소스에 안전하게 접근할 수 있도록 허용하는 표준 메커니즘이다.
동일 출처 정책(Same-Origin Policy)은 보안상의 이유로 다른 출처의 리소스 요청을 기본적으로 차단한다. 하지만 현대 웹 애플리케이션은 API 서버, CDN 등 다양한 출처에서 데이터를 가져와야 하기 때문에, 이러한 예외를 안전하게 허용하기 위해 CORS가 등장했다.
동일 출처 정책은 웹 애플리케이션이 자신과 동일한 출처(Scheme, Host, Port)에서만 리소스에 접근할 수 있도록 제한하는 보안 모델이다.
CORS는 클라이언트와 서버 간 HTTP 헤더를 통해 요청을 관리한다. 클라이언트가 요청을 보내면, 서버는 CORS 관련 헤더를 포함한 응답을 보내 이를 제어한다.
const cors = require('cors');
const express = require('express');
const app = express();
app.use(cors({ origin: 'http://example.com' }));
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app, resources={r"/api/*": {"origins": "http://example.com"}})
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://example.com");
}
}
모든 Origin을 허용(*
)하면 보안 문제가 발생할 가능성이 큼
Access-Control-Allow-Credentials
를 활성화할 경우, 특정 Origin만 허용해야
CORS는 웹 보안에서 중요한 역할을 하며, 동일 출처 정책의 한계를 보완해 현대 웹 애플리케이션 개발을 가능하게 한다. 적절한 설정과 이해를 통해 안전하고 효율적인 리소스 공유를 구현할 수 있다는 점에서 의의를 가져, 앞으로도 볼 일이 많은 친구일 것 같다.