CORS

웹 브라우저에서 실행되는 웹 애플리케이션에서 다른 도메인의 리소스에 접근할 때 발생하는 보안 정책

동일 출처 정책(Same-Origin Policy)에 따라 웹 페이지가 자신의 출처(origin)에서 로드한 리소스에만 접근이 허용되고, 다른 출처의 리소스에는 접근이 제한된다.

하지만 일부 경우 다른 출처의 리소스에 접근해야 할 필요가 생기는데, 이때 CORS가 사용된다.

CORS는 다른 도메인의 리소스에 대한 요청과 응답에 특정 HTTP 헤더를 추가함으로써 보안 정책을 우회하고, 클라이언트 측에서 안전하게 리소스를 요청할 수 있도록 한다.

중요한 이유

1. 다른 도메인에서의 데이터 접근 제어

CORS는 악의적인 웹 사이트로부터 사용자의 개인 정보를 보호하기 위해 필요하다. 만약 CORS가 없다면, 악의적인 웹 사이트가 사용자의 브라우저를 통해 다른 도메인에 접근하여 중요한 데이터를 요청하거나 조작할 수 있다.

2. CSRF(Cross-Site Request Forgery) 방지

CSRF 공격은 인증된 사용자의 권한을 이용하여 악의적인 요청을 보내는 공격 기법이다. CORS를 사용하면 다른 도메인으로의 요청이 제한되므로 CSRF 공격을 방지할 수 있다.

3. 데이터 무단 접근 방지

CORS를 사용하여 다른 도메인으로부터의 데이터 접근을 제한함으로써 데이터의 무단 유출을 방지할 수 있다.

예시 상황

  • 웹 서버: example.com
  • API 서버: api.example.com (CORS를 적용해야 하는 도메인)
  • 프레임워크: Node.js Express

1. 웹 서버 설정

웹 서버에서는 API 서버(api.example.com)으로의 요청에 대해 CORS를 허용하도록 헤더를 설정해야 한다.

const express = require('express')
const app = express()
 
// CORS 미들웨어 설정
app.use((req, res, next) => {
  // 특정 도메인 (example.com)의 요청만 허용하도록 '*' 대신 도메인을 명시할 수도 있다.
  res.header('Access-Control-Allow-Origin', '*')
 
  // 허용하는 HTTP 메서드 지정
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE')
 
  // 허용하는 헤더 설정
  res.header(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept'
  )
 
  next()
})

2. 클라이언트 설정

클라이언트 측에서는 XMLHttpRequest를 사용하거나 Fetch API 등을 이용하여 다른 도메인(api.example.com)으로 요청을 보낼 때, 특정 HTTP 헤더를 설정해야 한다.

fetch('https://api.example.com/data', {
  method: 'GET',
  headers: {
    'Content-Type': 'application/json'
  }
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error))

대처하는 방법

1. 서버 측 설정

위 예시처럼 웹 서버에서 적절한 CORS 헤더를 설정하여 클라이언트의 요청을 허용

2. 프록시 서버 사용

  • 클라이언트가 요청하는 API 엔드포인트와 동일한 도메인에 존재하는 프록시 서버를 사용하여 요청을 중개
  • 프록시 서버는 클라이언트 요청을 받아 API 서버로 전달하고, API 서버에서 받은 응답을 클라이언트로 다시 전달
  • 이렇게 하면 CORS 정책을 우회할 수 있지만, 중간에 프록시 서버가 추가되므로 네트워크 지연이 발생

우회하는 방법

1. JSONP (JSON with Padding)

  • 동일 출처 정책에 따르지 않고 JSON 데이터를 가져올 수 있는 방법
  • <script> 태그를 사용하여 외부 스크립트를 불러오는 방식
  • 서버에서는 콜백 함수로 JSON 데이터를 감싸서 클라이언트에게 전달
  • 보안상 취약하며, XSS(Cross-Site Scripting) 공격에 취약할 수 있으므로 권장되지 않는다.

2. 서버 프록시 설정 변경

  • CORS 정책을 적용하는 서버에서 특정 도메인에서의 요청을 허용하도록 설정을 변경
  • 웹 애플리케이션의 보안에 위험이 따르므로, 사용에 주의가 필요