운영체제

nginx sub 도메인에서 main 도메인으로 접근할때 aa.aaa.com -> aaa.com CORS 해결법

페이지 정보

작성자 DocsArchives
작성일 2025.09.07 20:24
분류 rhel
662 조회

본문

1. 기본 CORS 원리

브라우저는 출발 도메인(aa.aaa.com)과 응답 도메인(aaa.com)이 다르다고 판단 → CORS 헤더 필요.
즉, aaa.com 서버에서 Access-Control-Allow-Origin 등을 내려줘야 함.


2. nginx 설정 예시

(1) 단일 서브도메인 허용

server {    listen 443 ssl;    server_name aaa.com;
    location / {        # 실제 서비스 처리        proxy_pass http://backend;
        # CORS 허용 헤더        add_header 'Access-Control-Allow-Origin' 'https://aa.aaa.com' always;        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;        add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always;        add_header 'Access-Control-Allow-Credentials' 'true' always;
        # Preflight (OPTIONS) 요청 처리        if ($request_method = OPTIONS) {            add_header 'Access-Control-Allow-Origin' 'https://aa.aaa.com' always;            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;            add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always;            add_header 'Access-Control-Allow-Credentials' 'true' always;            return 204;        }    }}

(2) 모든 서브도메인 허용 (정규식 매칭)


nginx는 Access-Control-Allow-Origin에 와일드카드(*)를 쓰면 credentials(쿠키, 세션) 허용이 불가능해요.
그래서 보통 Origin 헤더를 읽어서 동적으로 반영합니다.

map $http_origin $cors_origin {    default "";    "~^https?://([a-z0-9-]+).aaa.com$" $http_origin;}
server {    listen 443 ssl;    server_name aaa.com;
    location / {        proxy_pass http://backend;
        if ($cors_origin != "") {            add_header 'Access-Control-Allow-Origin' $cors_origin always;            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;            add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always;            add_header 'Access-Control-Allow-Credentials' 'true' always;        }
        if ($request_method = OPTIONS) {            return 204;        }    }}

3. 체크리스트

  • 프론트엔드 요청 코드: fetchaxios 요청 시 credentials: 'include' 필요 여부 확인.

  • SSL: 반드시 HTTPS 환경에서 테스트 (특히 크롬).

  • OPTIONS 요청이 제대로 처리되는지 확인 (nginx에서 빠뜨리면 405 에러).

댓글 0
홈으로 전체메뉴
전체 검색
회원가입