Networks

CORS(교차 출처 리소스 공유): 개념, 필요성, 보안 및 해결 방법

Chrysans 2025. 4. 10. 12:52
728x90
반응형

 

CORS - Cross Origin Resource Sharing
cors 문구

 

들어가며

웹 개발을 하다 보면 한 번쯤은 마주치게 되는 빨간색 오류 메시지가 있습니다.

Access to fetch at 'https://api.example.com/data' from origin 'https://myapp.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

CORS(Cross-Origin Resource Sharing) 정책 위반 메시지입니다. 프론트엔드 개발자라면 누구나 한 번쯤은 마주치게 되는 이 오류는 단순히 귀찮은 장애물이 아니라, 웹의 핵심 보안 메커니즘 중 하나입니다.

오늘은 CORS가 무엇인지, 왜 필요한지, 어떤 보안 위협으로부터 우리를 보호하는지, 그리고 CORS 오류를 어떻게 해결할 수 있는지 심도 있게 알아보겠습니다.


목차

  1. CORS의 정의와 개념
  2. CORS가 필요한 이유: 동일 출처 정책(SOP)
  3. CORS가 방어하는 보안 위협들
    • CSRF(Cross-Site Request Forgery)
    • XSS(Cross-Site Scripting)
    • 데이터 유출
  4. CORS의 작동 방식
    • 단순 요청(Simple Request)
    • 프리플라이트 요청(Preflight Request)
    • 인증 정보를 포함한 요청
  5. CORS 오류 해결 방법
    • 서버 측 해결 방법
    • 클라이언트 측 해결 방법
    • 개발 환경에서의 해결 방법
  6. CORS 관련 헤더 상세 설명
  7. 결론 및 베스트 프랙티스

CORS의 정의와 개념

CORS(Cross-Origin Resource Sharing, 교차 출처 리소스 공유)는 웹 페이지가 다른 출처(도메인, 프로토콜, 포트)의 리소스에 접근할 수 있도록 허용하는 HTTP 헤더 기반의 메커니즘입니다. 웹 브라우저는 기본적으로 보안상의 이유로 웹 페이지가 다른 출처의 리소스에 접근하는 것을 제한합니다. 이를 '동일 출처 정책(Same-Origin Policy, SOP)'이라고 부릅니다.

CORS는 이러한 제한을 안전하게 완화하여, 서로 다른 출처 간의 데이터 공유를 가능하게 합니다. 쉽게 말해, CORS는 웹 애플리케이션이 다른 도메인의 API나 리소스를 사용할 수 있도록 하는 표준화된 방법입니다.

출처(Origin)란 무엇인가?

출처(Origin)는 URL의 프로토콜(http, https), 도메인(또는 호스트), 포트의 조합을 의미합니다. 예를 들어 https://www.example.com:443/path/의 출처는 https://www.example.com:443입니다.

두 URL의 출처가 동일한지 판단하려면 이 세 가지 요소가 모두 동일해야 합니다:

  • 프로토콜: http vs https
  • 도메인: example.com vs api.example.com
  • 포트: 80 vs 443

이 중 하나라도 다르다면 '다른 출처' 로 간주됩니다.


CORS가 필요한 이유: 동일 출처 정책(SOP)

웹 브라우저는 보안을 위해 '동일 출처 정책(Same-Origin Policy, SOP)'을 기본적으로 적용합니다. 이 정책은 한 출처에서 로드된 문서나 스크립트가 다른 출처의 리소스와 상호작용하는 것을 제한합니다.

SOP가 필요한 이유

동일 출처 정책은 악의적인 웹사이트가 사용자의 개인 정보나 민감한 데이터에 무단으로 접근하는 것을 방지하기 위해 설계되었습니다.

 

극단적으로 예를 들어, 사용자가 은행 웹사이트에 로그인한 상태에서 악성 웹사이트를 방문했다고 가정해 봅시다. SOP가 없다면, 이 악성 웹사이트는 JavaScript를 사용하여 은행 웹사이트에 요청을 보내고 사용자의 계좌 정보를 가져올 수 있습니다.

 

하지만 현대 웹 보안은 단순 SOP 뿐만 아니라 여러층의 보안 메커니즘이 함께 동작하므로 위 설명은 참고만 하면 될 것 같습니다.

SOP의 한계와 CORS의 필요성

그러나 현대 웹 애플리케이션은 종종 다양한 출처의 리소스를 필요로 합니다:

  • 프론트엔드와 백엔드 API를 분리하여 개발하는 아키텍처
  • 서드파티 API 통합(지도, 결제, 소셜 미디어 등)
  • 마이크로서비스 아키텍처
  • CDN(Content Delivery Network)에서 리소스 로드

이러한 요구사항을 충족시키면서도 보안을 유지하기 위해 CORS가 등장했습니다. CORS는 출처 간 리소스 공유를 안전하게 허용하기 위한 표준 메커니즘으로, 서버가 명시적으로 허용한 출처에만 리소스 접근을 허용합니다.


CORS가 방어하는 보안 위협들

CORS는 여러 웹 보안 위협으로부터 사용자와 웹 애플리케이션을 보호합니다. 구체적으로 어떤 공격을 방어하는지 알아보겠습니다.

CSRF(Cross-Site Request Forgery)

CSRF는 사용자가 자신의 의도와 무관하게 공격자가 의도한 행동을 수행하도록 하는 공격입니다.

공격 시나리오:

  1. 사용자가 은행 웹사이트(bank.com)에 로그인하여 인증 쿠키를 받습니다.
  2. 로그아웃하지 않은 상태에서 악성 웹사이트(evil.com)를 방문합니다.
  3. 악성 웹사이트는 사용자 모르게 은행 웹사이트로 송금 요청을 보냅니다.
  4. 브라우저는 요청에 bank.com의 인증 쿠키를 자동으로 포함합니다.
  5. 은행 서버는 유효한.쿠키를 가진 정상적인 요청으로 인식하고 송금을 실행합니다.

CORS는 이런 상황에서 evil.com에서 bank.com으로의 요청이 CORS 정책에 의해 차단될 수 있습니다. 특히 인증 정보(쿠키)를 포함한 요청의 경우 서버의 명시적 허용이 없으면 브라우저가 요청을 차단합니다.

XSS(Cross-Site Scripting)

XSS 공격은 웹 애플리케이션이 사용자로부터 입력받은 데이터를 적절히 검증하거나 이스케이프(escape)하지 않고 웹 페이지에 포함시킬 때 발생합니다. 공격자는 이 취약점을 이용해 JavaScript와 같은 클라이언트 측 스크립트를 삽입하고, 이 스크립트는 희생자의 브라우저에서 실행됩니다.

공격 시나리오:

  1. 공격자가 취약한 웹사이트의 댓글 기능을 통해 악성 JavaScript 코드를 삽입합니다.
  2. 다른 사용자가 해당 페이지를 -방문하면 삽입된 악성 코드가 실행됩니다.
  3. 악성 코드는 사용자의 쿠키나 세션 정보를 탈취하거나 다른 악의적인 행동을 수행할 수 있습니다.

CORS 자체만으로는 XSS를 완전히 방어할 수 없지만, 악성 스크립트가 다른 출처의 데이터에 접근하는 것을 제한함으로써 피해를 줄일 수 있습니다.

데이터 유출

CORS는 악의적인 웹사이트가 다른 웹사이트의 민감한 데이터에 무단으로 접근하는 것을 방지합니다.

공격 시나리오:

  1. 사용자가 내부 기업 포털(internal.company.com)에 로그인합니다.
  2. 사용자가 악성 웹사이트를 방문합니다.
  3. 악성 웹사이트는 JavaScript를 사용하여 내부 기업 포털의 API에 접근을 시도합니다.
  4. CORS 정책이 없다면, 악성 사이트는 기업 내부 데이터에 접근할 수 있습니다.

CORS는 기업 포털 서버가 허용한 출처의 요청만 받아들이도록 함으로써 이러한 데이터 유출을 방지합니다.


CORS의 작동 방식

CORS는 HTTP 헤더를 통해 작동합니다. 브라우저와 서버 간의 통신 과정에서 이러한 헤더를 주고받음으로써 교차 출처 요청의 허용 여부를 결정합니다. CORS의 작동 방식은 요청의 종류에 따라 다릅니다.

단순 요청(Simple Request)

단순 요청은 프리플라이트 없이 바로 서버에 전송되는 요청입니다. 다음 조건을 모두 충족해야 단순 요청으로 처리됩니다:

  1. 다음 HTTP 메서드 중 하나를 사용:
    • GET
    • HEAD
    • POST
  2. 자동으로 설정되는 헤더 외에 다음 헤더만 수동으로 설정 가능:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type (아래 값으로 제한)
      • application/x-www-form-urlencoded
      • multipart/form-data
      • text/plain
  3. 요청에 ReadableStream 객체가 사용되지 않음
  4. XMLHttpRequestUpload 객체에 이벤트 리스너가 등록되지 않음

단순 요청의 경우, 브라우저는 바로 요청을 서버로 보내고, 서버는 응답 헤더에 Access-Control-Allow-Origin 헤더를 포함시켜 응답합니다. 브라우저는 이 헤더 값을 확인하여 해당 출처에서의 접근이 허용되는지 판단합니다.

프리플라이트 요청(Preflight Request)

단순 요청 조건을 충족하지 않는 요청은 프리플라이트(preflight) 요청을 먼저 보냅니다. 이는 본 요청을 보내기 전에 해당 요청이 안전한지 확인하는 과정입니다.

프리플라이트 요청은 HTTP OPTIONS 메서드를 사용하며, 다음과 같은 헤더를 포함합니다:

  • Origin: 요청 출처
  • Access-Control-Request-Method: 실제 요청에서 사용할 HTTP 메서드
  • Access-Control-Request-Headers: 실제 요청에서 사용할 사용자 정의 헤더

서버는 다음과 같은 헤더로 응답합니다:

  • Access-Control-Allow-Origin: 허용된 출처
  • Access-Control-Allow-Methods: 허용된 HTTP 메서드
  • Access-Control-Allow-Headers: 허용된 헤더
  • Access-Control-Max-Age: 프리플라이트 요청 결과를 캐시할 시간(초)

브라우저는 이 응답을 확인하여 본 요청을 진행할지 결정합니다.

인증 정보를 포함한 요청

쿠키, HTTP 인증, 클라이언트 SSL 인증서와 같은 인증 정보를 포함하는 요청의 경우, 추가적인 처리가 필요합니다.

클라이언트 측에서는 요청 시 credentials: 'include' 옵션을 설정해야 하고, 서버는 다음 헤더를 응답에 포함해야 합니다:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin: 와일드카드(*)가 아닌 구체적인 출처

이러한 제약은 민감한 정보가 포함된 요청을 더 엄격하게 제어하기 위함입니다.

 

프리플라이트 요청의 작동 방식

예를 들어 다음과 같은 API 요청이 있다고 가정해 봅시다:

fetch('https://api.example.com/data', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token123'
  },
  body: JSON.stringify({ name: '홍길동' })
});

이 요청은 단순 요청 조건을 충족하지 않으므로 브라우저는 다음과 같은 과정을 거칩니다:

1. 프리플라이트 요청 발송

브라우저는 먼저 OPTIONS 메서드를 사용하여 서버에 프리플라이트 요청을 보냅니다:

OPTIONS /data HTTP/1.1
Host: api.example.com
Origin: http://localhost:3000
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: Content-Type, Authorization

이 요청에는:

  • Access-Control-Request-Method: 실제로 사용할 HTTP 메서드
  • Access-Control-Request-Headers: 실제 요청에 포함될 커스텀 헤더들

2. 서버의 프리플라이트 응답

서버는 다음과 같은 헤더를 포함한 응답을 반환합니다:

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400

이 응답에는:

  • Access-Control-Allow-Origin: 허용되는 출처
  • Access-Control-Allow-Methods: 허용되는 HTTP 메서드 목록
  • Access-Control-Allow-Headers: 허용되는 헤더 목록
  • Access-Control-Max-Age: 프리플라이트 요청 결과를 캐시하는 시간(초)

3. 실제 요청 발송

프리플라이트 응답이 긍정적(허용)이면, 브라우저는 원래 의도했던 실제 요청을 보냅니다:

PUT /data HTTP/1.1
Host: api.example.com
Origin: http://localhost:3000
Content-Type: application/json
Authorization: Bearer token123

{"name":"홍길동"}

4. 실제 응답 처리

서버는 다음과 같은 CORS 헤더를 포함한 응답을 반환합니다:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://localhost:3000
Content-Type: application/json

{"success": true, "id": 123}

정리

프리플라이트 요청은:

  1. 브라우저가 자동으로 수행하는 보안 점검 단계
  2. OPTIONS HTTP 메서드를 사용
  3. 서버에게 실제 요청이 안전한지 미리 확인
  4. 단순 요청이 아닌 경우에만 필요
  5. 서버가 적절한 CORS 헤더로 응답해야 실제 요청이 진행됨

CORS 오류 해결 방법

CORS 오류는 클라이언트와 서버 양쪽에서 해결할 수 있습니다. 상황에 맞는 최적의 접근 방식을 선택하는 것이 중요합니다.

서버 측 해결 방법

서버 측에서 CORS를 해결하는 것이 가장 올바른 방법입니다. 주요 웹 프레임워크별 CORS 설정 방법은 다음과 같습니다:

Express.js (Node.js)

Express.js에서는 cors 미들웨어를 사용할 수 있습니다:

const express = require('express');
const cors = require('cors');
const app = express();

// 모든 출처 허용 (개발용)
app.use(cors());

// 또는 특정 출처만 허용 (프로덕션 권장)
app.use(cors({
  origin: 'https://yourfrontend.com',
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization'],
  credentials: true
}));

app.listen(3000);

Spring Boot (Java)

Spring Boot에서는 WebMvcConfigurer를 구현하여 CORS를 설정할 수 있습니다:

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("https://yourfrontend.com")
            .allowedMethods("GET", "POST", "PUT", "DELETE")
            .allowedHeaders("Content-Type", "Authorization")
            .allowCredentials(true);
    }
}

 

클라이언트 측 해결 방법

클라이언트 측에서 CORS 문제를 해결하는 방법은 제한적이지만, 특정 상황에서는 유용할 수 있습니다. 

프록시 서버 사용

개발 중인 애플리케이션이 서버 CORS 설정을 변경할 수 없는 외부 API에 접근해야 하는 경우, 프록시 서버를 사용할 수 있습니다.

CRA

// package.json
{
  "proxy": "https://api.example.com"
}

webpack dev server

// webpack.config.js
module.exports = {
  // ...
  devServer: {
    proxy: {
      '/api': {
        target: 'https://api.example.com',
        changeOrigin: true,
        pathRewrite: { '^/api': '' }
      }
    }
  }
};

next.js

// next.config.js
module.exports = {
  async rewrites() {
    return [
      {
        source: '/api/:path*',
        destination: 'https://api.example.com/:path*'
      }
    ]
  }
}

vite

Vite는 vite.config.js 파일에서 간편하게 프록시를 설정할 수 있습니다:

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  server: {
    proxy: {
      // 문자열 단축 표기
      '/api': 'http://api.example.com',
      
      // 옵션을 사용한 자세한 설정
      '/api2': {
        target: 'http://api2.example.com',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api2/, ''),
        // 요청 헤더 추가
        headers: {
          'X-Custom-Header': 'vite-proxy'
        }
      }
    }
  }
});

Vite의 프록시 설정은 매우 유연하고 강력하며, 최신 웹 개발 워크플로우에 최적화되어 있습니다.

JSONP (레거시 방법)

JSONP는 <script> 태그가 CORS 제한을 받지 않는다는 점을 이용한 오래된 기법입니다. 현대 웹 개발에서는 보안상의 이유로 권장되지 않습니다:

function handleResponse(data) {
  console.log(data);
}

const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
document.body.appendChild(script);

개발 환경에서의 해결 방법

개발 환경에서만 사용할 수 있는 임시 해결책도 있습니다. 프로덕션 환경에서는 사용하지 말아야 합니다.

브라우저 CORS 비활성화

개발 및 테스트 목적으로만 사용해야 합니다:

  • Chrome: --disable-web-security 플래그와 함께 실행
  • Firefox: CORS Everywhere 확장 프로그램 사용
  • Safari: 개발자 메뉴에서 웹 보안 비활성화

브라우저 확장 프로그램

CORS 문제를 임시로 해결할 수 있는 브라우저 확장 프로그램:

  • Chrome/Edge: "CORS Unblock" 또는 "Allow CORS"
  • Firefox: "CORS Everywhere"

CORS 관련 헤더 상세 설명

CORS 작동 방식을 더 깊이 이해하기 위해 주요 HTTP 헤더들을 자세히 살펴보겠습니다.

요청 헤더 (클라이언트 → 서버)

  1. Origin
  2. Access-Control-Request-Method (프리플라이트 요청에서 사용)
    • 실제 요청에서 사용할 HTTP 메서드
    • 예: Access-Control-Request-Method: POST
  3. Access-Control-Request-Headers (프리플라이트 요청에서 사용)
    • 실제 요청에서 사용할 사용자 정의 헤더
    • 예: Access-Control-Request-Headers: Content-Type, Authorization

응답 헤더 (서버 → 클라이언트)

  1. Access-Control-Allow-Origin
    • 리소스에 접근할 수 있는 출처를 지정
    • 예: Access-Control-Allow-Origin: https://frontend.example.com
    • 모든 출처 허용: Access-Control-Allow-Origin: * (인증 요청과 함께 사용할 수 없음)
  2. Access-Control-Allow-Methods
    • 리소스에 접근할 수 있는 HTTP 메서드를 지정
    • 예: Access-Control-Allow-Methods: GET, POST, PUT, DELETE
  3. Access-Control-Allow-Headers
    • 실제 요청에서 사용할 수 있는 헤더를 지정
    • 예: Access-Control-Allow-Headers: Content-Type, Authorization
  4. Access-Control-Allow-Credentials
    • 요청에 인증 정보(쿠키, HTTP 인증, 클라이언트 SSL 인증서)를 포함할 수 있는지 지정
    • 예: Access-Control-Allow-Credentials: true
  5. Access-Control-Expose-Headers
    • 브라우저가 접근할 수 있는 응답 헤더를 지정
    • 기본적으로, 브라우저는 Cache-Control, Content-Language, Content-Type, Expires, Last-Modified, Pragma만 접근 가능
    • 예: Access-Control-Expose-Headers: X-Custom-Header, Content-Length
  6. Access-Control-Max-Age
    • 프리플라이트 요청 결과를 캐시할 수 있는 시간(초)
    • 예: Access-Control-Max-Age: 3600 (1시간)

결론 및 베스트 프랙티스

CORS는 웹 보안에 중요한 메커니즘이며, 출처가 다른 리소스에 대한 접근을 제어함으로써 사용자를 보호합니다. CORS 정책을 적절히 구성하면 웹 애플리케이션의 보안을 강화하면서도 필요한 리소스에 접근할 수 있습니다.

CORS 관련 베스트 프랙티스

  1. 최소 권한 원칙 적용
    • 모든 출처(*)를 허용하지 말고, 필요한 출처만 명시적으로 허용하세요.
    • 특히 인증 정보가 포함된 요청에서는 와일드카드 출처를 사용할 수 없습니다.
  2. 필요한 HTTP 메서드와 헤더만 허용
    • API에 필요한 HTTP 메서드(GET, POST 등)만 명시적으로 허용하세요.
    • 필요한 사용자 정의 헤더만 허용하세요.
  3. 프리플라이트 캐싱 활용
    • Access-Control-Max-Age 헤더를 사용하여 프리플라이트 요청 결과를 캐시하면 성능을 개선할 수 있습니다.
  4. 서브도메인 주의
    • example.com과 api.example.com은 서로 다른 출처로 간주됩니다.
    • 필요시 모든 서브도메인에 대해 CORS 설정을 확인하세요.
  5. 프로덕션 환경에서 임시 해결책 사용 금지
    • 브라우저 보안 비활성화, CORS 우회 프록시는 개발 환경에서만 사용하세요.
    • 프로덕션 환경에서는 항상 서버 측에서 적절한 CORS 헤더를 설정하세요.
  6. 정기적인 보안 검토
    • CORS 설정을 정기적으로 검토하여 필요 이상의 권한을 부여하지 않도록 하세요.
    • 더 이상 사용하지 않는 출처는 허용 목록에서 제거하세요.

전문 용어 설명

  • SOP(Same-Origin Policy): 동일 출처 정책. 웹 브라우저에서 한 출처에서 로드된 문서나 스크립트가 다른 출처의 리소스와 상호작용하는 것을 제한하는 보안 메커니즘입니다.
  • CSRF(Cross-Site Request Forgery): 사이트 간 요청 위조. 웹사이트 이용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 수행하게 하는 공격 방식입니다.
  • XSS(Cross-Site Scripting): 사이트 간 스크립팅. 웹사이트 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입하는 공격 방식입니다.
  • Preflight Request: 프리플라이트 요청. 브라우저가 교차 출처 요청을 보내기 전에 해당 요청이 서버에서 허용되는지 확인하기 위해 보내는 사전 요청입니다.
  • HTTP Headers: HTTP 헤더. 클라이언트와 서버가 HTTP 요청 또는 응답에 함께 전송하는 부가적인 정보를 담고 있는 데이터입니다. CORS는 주로 HTTP 헤더를 통해 작동합니다.
  • Credentials: 인증 정보. 요청에 포함될 수 있는 쿠키, HTTP 인증, 클라이언트 SSL 인증서 등을 의미합니다.
  • Origin: 출처. URL의 프로토콜, 도메인, 포트의 조합을 의미합니다.
  • Proxy: 프록시. 클라이언트와 서버 사이에서 중개자 역할을 하는 서버로, CORS 문제를 우회하는 데 사용될 수 있습니다.
  • JSONP: JSON with Padding. <script> 태그가 CORS 제한을 받지 않는 점을 이용한 레거시 기법으로, 다른 도메인의 데이터를 가져오는 방법입니다.
  • CDN(Content Delivery Network): 콘텐츠 전송 네트워크. 지리적으로 분산된 서버 네트워크를 통해 웹 콘텐츠를 더 빠르게 제공하는 시스템입니다.

자주 묻는 질문 (FAQ)

Q: CORS와 SOP의 차이점은 무엇인가요?

A: SOP(Same-Origin Policy)는 기본적인 보안 정책으로, 다른 출처의 리소스에 대한 접근을 제한합니다. CORS(Cross-Origin Resource Sharing)는 SOP의 제한을 완화하여, 서버가 명시적으로 허용한 다른 출처의 리소스 접근을 가능하게 하는 메커니즘입니다.

Q: 로컬 개발 환경에서만 CORS 오류가 발생하는 이유는 무엇인가요?

A: 개발 환경에서는 종종 프론트엔드와 백엔드가 다른 포트에서 실행됩니다(예: 프론트엔드는 http://localhost:3000, 백엔드는 http://localhost:8080). 이들은 포트가 다르기 때문에 서로 다른 출처로 간주되어 CORS 오류가 발생합니다. 프로덕션 환경에서는 일반적으로 같은 도메인에서 서비스되거나, 적절한 CORS 설정이 되어 있습니다.

Q: CORS 설정 없이 API를 호출하는 방법이 있나요?

A: 클라이언트 측 JavaScript에서 직접 다른 출처의 API를 호출할 때는 CORS 설정이 필요합니다. 그러나 서버 측에서는 CORS 제한이 적용되지 않으므로, 백엔드 서버를 프록시로 사용하여 API를 호출하는 방법이 있습니다.

Q: 인증 정보(쿠키)를 포함한 요청에서 Access-Control-Allow-Origin: *를 사용할 수 없는 이유는 무엇인가요?

A: 이는 보안상의 이유 때문입니다. 와일드카드(*)를 사용하여 모든 출처를 허용하면서 동시에 인증 정보를 포함하면, 모든 웹사이트가 사용자의 인증 정보를 포함한 요청을 해당 서버로 보낼 수 있게 되어 CSRF 공격에 취약해집니다.

Q: CORS 오류를 디버깅하는 가장 좋은 방법은 무엇인가요?

A: 브라우저 개발자 도구의 네트워크 탭을 사용하여 요청과 응답 헤더를 자세히 살펴보세요. 특히 프리플라이트 요청(OPTIONS 메서드)의 응답 헤더를 확인하면 필요한 CORS 헤더가 누락되었는지 파악할 수 있습니다.

Q: 서버 측 CORS 설정을 변경할 수 없는 외부 API를 사용해야 할 때는 어떻게 해야 하나요?

A: 이런 경우, 프록시 서버를 사용하는 것이 가장 좋은 해결책입니다. 프록시 서버는 클라이언트의 요청을 받아 외부 API로 전달하고, 응답을 다시 클라이언트에게 전달합니다. 이 과정에서 CORS 헤더를 적절히 추가할 수 있습니다.

 

 

https://covelope.tistory.com/entry/%ED%98%BC%ED%95%A9-%EC%BD%98%ED%85%90%EC%B8%A0Mixed-Content-%EC%9B%90%EC%9D%B8%EA%B3%BC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95?category=1155278

 

혼합 콘텐츠(Mixed Content): 원인과 해결 방법

들어가며웹 애플리케이션을 개발하다 보면 갑자기 브라우저에서 다음과 같은 경고를 마주칠 때가 있습니다:이 페이지에 안전하지 않은 콘텐츠(혼합 콘텐츠)가 포함되어 있습니다. 혼합 콘텐츠

covelope.tistory.com

 

https://covelope.tistory.com/entry/Http-Https-%EB%9E%80-http-https-%EC%B0%A8%EC%9D%B4

 

Http / Https 란? (http 와 https 차이)

1. httpHTTP란 Hypertext Transfer Protocol의 약자이다.HTTP 는 HTML 문서와 같은 리소스를 가져올 수 있도록 해주는 프로토콜인데HTTP 는 웹에서 이루어지는 모든 데이터 교환의 기초이며 클라이언트-서버 프

covelope.tistory.com

 

 

728x90
반응형

'Networks' 카테고리의 다른 글

혼합 콘텐츠(Mixed Content): 원인과 해결 방법  (0) 2025.04.03
OSI 7 계층(osi 7 layer)  (0) 2023.05.11
Http / Https 란? (http 와 https 차이)  (0) 2023.04.24