안녕하세요, 코딩하는곰입니다! 오늘은 Angular 개발자라면 한 번쯤 마주치는 CORS 오류에 대해 깊이 있게 다루어보려고 합니다. API 통신을 구현하다 보면 ‘Access-Control-Allow-Origin’ 에러 메시지를 자주 접하게 되는데요, 이는 브라우저의 보안 정책인 CORS(Cross-Origin Resource Sharing) 때문입니다. 20년 넘게 Vue.js와 Angular를 다루어온 경험을 바탕으로, 개발 환경에서의 프록시 설정부터 프로덕션 환경의 서버 헤더 조정까지 모든 해결 방법을 상세하게 설명드리겠습니다.
CORS(Cross-Origin Resource Sharing)는 웹 애플리케이션 보안을 위해 설계된 메커니즘입니다. 기본적으로 브라우저는 동일 출처 정책(Same-Origin Policy)에 따라 다른 도메인, 프로토콜, 포트를 가진 리소스 요청을 제한합니다. CORS는 이러한 제한을 안전하게 우회하기 위한 표준 방법을 제공합니다. CORS 동작 방식:
// Angular에서 CORS 오류가 발생하는 일반적인 HTTP 요청import { HttpClient } from '@angular/common/http';@Injectable()export class DataService {constructor(private http: HttpClient) {}// 다른 도메인으로의 요청에서 CORS 오류 발생fetchData() {return this.http.get('https://api.otherdomain.com/data');}}
CORS 오류를 해결하지 않으면 Angular 애플리케이션은 API와의正常적인 통신이 불가능해지며, 이는 사용자 경험과 기능 구현에 심각한 영향을 미칩니다.
📊 데이터 분석과 프로그래밍에 관심이 있다면, (HTML/CSS 기초) a 태그 완벽 가이드 내부/외부 링크 구분부터 SEO 최적화까지를 참고해보세요.
Angular CLI를 사용하는 개발 환경에서는 프록시 설정을 통해 CORS 문제를 간편하게 해결할 수 있습니다. 프록시 설정은 개발 서버가 API 요청을 중계하도록 하여, 브라우저가 동일 출처에서 요청하는 것처럼 인식하게 만듭니다.
프록시 설정 파일 생성:
proxy.conf.json 파일을 프로젝트 루트에 생성합니다.
{"/api": {"target": "https://api.example.com","secure": false,"changeOrigin": true,"logLevel": "debug","pathRewrite": {"^/api": ""}}}
설정 옵션 상세 설명:
/api: 프록시를 적용할 경로 패턴target: 실제 API 서버 주소secure: HTTPS 대상에 대한 인증서 검증 무시 (개발용)changeOrigin: Origin 헤더를 대상 URL에 맞게 변경pathRewrite: URL 경로 재작성 규칙
Angular CLI에 프록시 적용:
angular.json 파일을 수정하거나 CLI 명령어에 프록시 설정을 추가합니다.// angular.json"serve": {"builder": "@angular-devkit/build-angular:dev-server","options": {"browserTarget": "your-app:build","proxyConfig": "proxy.conf.json"}}
# 또는 CLI 명령어로 실행ng serve --proxy-config proxy.conf.json
다중 프록시 설정:
여러 API 서버를 사용하는 경우, proxy.conf.js 파일을 사용하여 동적 설정이 가능합니다.
const PROXY_CONFIG = [{context: ["/api", "/auth"],target: "https://api.example.com",secure: false},{context: "/uploads",target: "https://cdn.example.com",secure: false}];module.exports = PROXY_CONFIG;
프록시 설정의 장점은 클라이언트 코드 변경 없이 개발 환경의 CORS 문제를 해결할 수 있다는 점입니다. 하지만 이 방법은 개발 환경에서만 유효하며, 프로덕션 환경에서는 적용되지 않습니다.
인터넷을 사용할 때 우리가 사용하는 IP는 생각보다 많은 정보를 담고 있습니다. 아이피 기반 위치 조회로 간단히 알아볼 수 있습니다.
프로덕션 환경에서는 서버 측에서 CORS 헤더를 적절히 설정해야 합니다. 다양한 백엔드 기술별로 CORS를 설정하는 방법을 알아보겠습니다. Express.js에서의 CORS 설정:
const express = require('express');const cors = require('cors');const app = express();// 기본 CORS 설정 (모든 도메인 허용)app.use(cors());// 세부적인 CORS 설정app.use(cors({origin: 'https://your-angular-app.com',methods: ['GET', 'POST', 'PUT', 'DELETE'],allowedHeaders: ['Content-Type', 'Authorization'],credentials: true}));// 특정 경로만 CORS 허용app.get('/api/data', cors(), (req, res) => {res.json({ message: 'CORS-enabled route' });});
Spring Boot에서의 CORS 설정:
@Configurationpublic class CorsConfig {@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurer() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("https://your-angular-app.com").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").allowCredentials(true);}};}}
ASP.NET Core에서의 CORS 설정:
public class Startup{public void ConfigureServices(IServiceCollection services){services.AddCors(options =>{options.AddPolicy("AllowAngularApp",builder =>{builder.WithOrigins("https://your-angular-app.com").AllowAnyMethod().AllowAnyHeader().AllowCredentials();});});}public void Configure(IApplicationBuilder app){app.UseCors("AllowAngularApp");}}
수동 CORS 헤더 설정: 미들웨어를 사용하지 않고 직접 헤더를 설정하는 방법:
// Node.js/Express 예시app.use((req, res, next) => {res.header('Access-Control-Allow-Origin', 'https://your-angular-app.com');res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');res.header('Access-Control-Allow-Credentials', 'true');// Preflight 요청 처리if (req.method === 'OPTIONS') {return res.sendStatus(200);}next();});
Angular에서 인증 정보 포함 요청: CORS 설정과 함께 Angular에서 인증 정보를 포함하는 방법:
import { HttpClient, HttpHeaders } from '@angular/common/http';@Injectable()export class AuthService {constructor(private http: HttpClient) {}login(credentials: any) {const headers = new HttpHeaders({'Content-Type': 'application/json'});return this.http.post('https://api.example.com/auth/login',credentials,{headers: headers,withCredentials: true // 쿠키 포함 설정});}}
서버 측 CORS 설정은 프로덕션 환경에서 필수적이며, 보안을 위해 특정 도메인만 허용하는 것이 좋습니다.
매일 두뇌 운동을 위한 스도쿠가 필요하다면, 한국어와 영어를 지원하는 스도쿠 저니를 다운로드하세요.
CORS 오류는 Angular 개발에서 빈번하게 마주치는 과제이지만, 올바른 이해와 적절한 설정으로 충분히 해결할 수 있습니다. 개발 환경에서는 프록시 설정을, 프로덕션 환경에서는 서버 헤더 조정을 통해 효과적으로 대응하세요. 보안과 기능 사이의 균형을 유지하며, 사용자에게 원활한 경험을 제공하는 것이 가장 중요합니다. CORS 정책을 이해하고 적절히 활용하면 더 안전하고 효율적인 웹 애플리케이션을 개발할 수 있습니다. 다음 포스팅에서 또 다른 유용한 개발 팁으로 찾아뵙겠습니다. 감사합니다!
로또 번호를 더 스마트하게 선택하고 싶다면, AI 분석 기반 번호 추천 앱 지니로또AI를 활용해보는 것이 좋습니다.
