CORS 이해하기: 크로스 오리진 리소스 공유의 모든 것

2025. 5. 29. 01:02·Backend Development
반응형

서론

현대 웹 애플리케이션은 다양한 출처(Origin)의 리소스를 활용합니다. 이때 발생할 수 있는 보안 문제를 해결하기 위해 CORS(Cross-Origin Resource Sharing)가 등장했습니다. 본 글에서는 CORS의 개념, 필요성, 그리고 작동 방식을 상세히 설명하겠습니다.


CORS의 기본 개념

1. CORS란?

CORS는 서로 다른 출처 간의 리소스 공유를 가능하게 하는 보안 메커니즘입니다. 여기서 출처(Origin)는 다음 세 가지 요소로 구성됩니다:

  • 프로토콜 (http, https)
  • 도메인 (example.com)
  • 포트 (80, 443 등)

2. 출처 비교 예시

URL 1 URL 2 동일 출처 여부
https://example.com https://example.com O
https://example.com http://example.com X (프로토콜 다름)
https://example.com https://api.example.com X (도메인 다름)
https://example.com:80 https://example.com:443 X (포트 다름)

CORS의 필요성

1. 보안 문제의 역사

  • CSRF(Cross-Site Request Forgery): 악의적인 사이트가 사용자의 브라우저를 통해 다른 사이트에 요청을 보내는 공격
  • SOP(Same-Origin Policy): 동일 출처의 리소스만 접근 가능하도록 제한하는 브라우저 정책

2. 현대 웹의 요구사항

  • API 서버와 프론트엔드의 분리
  • CDN을 통한 리소스 제공
  • 마이크로서비스 아키텍처

CORS의 작동 방식

1. Simple Request

가장 기본적인 CORS 요청 방식입니다.

조건

  • GET, POST, HEAD 메서드
  • 특정 헤더만 사용
  • Content-Type: application/x-www-form-urlencoded, multipart/form-data, text/plain

요청 예시

GET /api/data HTTP/1.1
Host: api.example.com
Origin: https://client.example.com

응답 예시

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.example.com

2. Preflight Request

복잡한 요청을 보내기 전에 먼저 확인하는 방식입니다.

요청 예시

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

응답 예시

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.example.com
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Max-Age: 86400

3. Credential Request

인증 정보를 포함한 요청입니다.

요청 예시

fetch('https://api.example.com/data', {
  credentials: 'include',
  headers: {
    'Authorization': 'Bearer token123'
  }
});

응답 예시

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.example.com
Access-Control-Allow-Credentials: true

CORS 설정 방법

1. Spring Boot 설정

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

2. Node.js Express 설정

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

const app = express();

app.use(cors({
    origin: 'https://client.example.com',
    methods: ['GET', 'POST', 'PUT', 'DELETE'],
    allowedHeaders: ['Content-Type', 'Authorization'],
    credentials: true
}));

CORS 관련 문제 해결

1. 일반적인 오류

  • Access-Control-Allow-Origin 헤더 누락
  • 잘못된 출처 설정
  • 인증 정보 누락

2. 디버깅 방법

  • 브라우저 개발자 도구 확인
  • 서버 로그 분석
  • 네트워크 요청/응답 검사

결론

CORS는 현대 웹 애플리케이션의 필수적인 보안 메커니즘입니다. 적절한 CORS 설정은 보안을 유지하면서도 필요한 리소스 공유를 가능하게 합니다.

인사이트: CORS는 단순한 기술적 설정이 아닌, 웹 애플리케이션의 보안과 기능성을 동시에 고려해야 하는 중요한 설계 요소입니다. 개발자는 CORS의 동작 원리를 이해하고, 이를 적절히 활용해야 합니다.


참고 자료

  • MDN Web Docs - CORS
  • Spring Framework CORS Documentation
  • Express CORS Middleware
반응형
저작자표시 비영리 변경금지 (새창열림)

'Backend Development' 카테고리의 다른 글

HTTPS: 웹 보안의 기본, 안전한 통신의 시작  (2) 2025.05.29
스택(Stack) 자료구조: 개념부터 구현까지  (4) 2025.05.29
MySQL InnoDB의 락킹 메커니즘: 갭락과 넥스트키 락 이해하기  (0) 2025.05.29
Spring AOP와 @Transactional: private 메서드에서의 동작 방식  (0) 2025.05.29
네트워크 타임아웃 이해하기: Connection, Socket, Read Timeout  (2) 2025.05.29
'Backend Development' 카테고리의 다른 글
  • 스택(Stack) 자료구조: 개념부터 구현까지
  • MySQL InnoDB의 락킹 메커니즘: 갭락과 넥스트키 락 이해하기
  • Spring AOP와 @Transactional: private 메서드에서의 동작 방식
  • 네트워크 타임아웃 이해하기: Connection, Socket, Read Timeout
Kun Woo Kim
Kun Woo Kim
안녕하세요, 김건우입니다! 웹과 앱 개발에 열정적인 전문가로, React, TypeScript, Next.js, Node.js, Express, Flutter 등을 활용한 프로젝트를 다룹니다. 제 블로그에서는 개발 여정, 기술 분석, 실용적 코딩 팁을 공유합니다. 창의적인 솔루션을 실제로 적용하는 과정의 통찰도 나눌 예정이니, 궁금한 점이나 상담은 언제든 환영합니다.
  • Kun Woo Kim
    WhiteMouseDev
    김건우
  • 깃허브
    포트폴리오
    velog
  • 전체
    오늘
    어제
  • 공지사항

    • [인사말] 이제 티스토리에서도 만나요! WhiteMouse⋯
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 분류 전체보기 (100) N
      • Frontend Development (39) N
      • Backend Development (21) N
      • Algorithm (33) N
        • 백준 (11) N
        • 프로그래머스 (17)
        • 알고리즘 (5)
      • Infra (1)
      • 자료구조 (3)
  • 링크

    • Github
    • Portfolio
    • Velog
  • 인기 글

  • 태그

    tailwindcss
    frontend development
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Kun Woo Kim
CORS 이해하기: 크로스 오리진 리소스 공유의 모든 것
상단으로

티스토리툴바