트러블 슈팅: CORS ‐ Preflight 요청 에러 해결 - minumsa/carver-music GitHub Wiki
문제 상황
로컬호스트에서 데이터 조회 API를 호출할 때 다음과 같은 CORS 에러가 발생했습니다. 데이터 조회 API를 호출할 때 실제 사이트를 배포한 도메인 https://music.divdivdiv.com
으로 URL 경로를 잡았는데, 로컬호스트에서 작업할 때는 도메인이 http://localhost:3000
으로 설정되어 SOP를 위반하기 때문이었습니다.
CORS - Preflight Request 에러 |
---|
해결 과정
환경변수 활용
CORS 에러의 원인은 브라우저가 동일출처 정책(Same-Origin Policy)을 위반하는 요청을 차단하기 때문입니다.
이를 방지하기 위해 NEXT_PUBLIC_BASE_URL
이라는 환경변수를 만들었습니다. 이를 통해 서버 코드에서는 .env 파일의 변수값을, 배포된 실제 사이트에서는 Vercel의 환경변수 설정란에 저장해둔 변수값을 적용해 CORS 설정을 동적으로 작동시켰습니다.
// album.ts
export async function fetchAlbumDataCSR(albumFilters: AlbumFilters) {
try {
// ...
const url = `${BASE_URL}/api${queryString}`;
const response = await fetch(url, {
method: "GET",
headers: {
"Content-Type": "application/json",
},
});
// ...
} catch (error) {
// ...
}
}
// apiURLs.ts
require("dotenv").config();
export const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL;
// .env
NEXT_PUBLIC_BASE_URL="http://localhost:3000"
Vercel - 환경변수 설정 화면 |
---|
배운 점
- 환경변수를 사용해 CORS 설정을 관리하는 방법의 중요성을 배웠습니다.
- 서버와 클라이언트 코드 모두에서 환경변수를 통해 설정값을 동적으로 적용함으로써, 개발 환경과 배포 환경 간의 설정을 쉽게 관리할 수 있다는 점을 알게 되었습니다.
- 특히, 보안과 관련된 설정값을 코드에 직접 하드코딩하지 않음으로써 코드의 보안을 향상시킬수 있음을 깨달았습니다.