[Back-End] CORS란 무엇인가요?

2025. 1. 10. 11:06·Back-end
반응형
매일메일을 통한
하루하루 CS 공부하기

 

CORS란?

Cross Origin Resource Sharing : 출처가 다른 곳의 리소스를 요청할 때 접근 권한을 부여하는 매커니즘.

 

즉, 리소스를 주고 받는 두 곳 (프론트엔드 & 백엔드)의 도메인이 다르면, 출처가 교차한다고 한다.

 

이 출처는 프로토콜 + URL + 포트까지 전부 포함하는 개념이다.

 

만약 클라이언트의 출처가 허용되지 않았다면, CORS 에러가 발생할 수 있다. 즉, 브라우저에서 특정 리소스를 요청할 때 발생하는 에러라는 것!

 

CORS는 왜 필요한가?

CSRF (Cross-Site Resource Forgery) : 피해자의 브라우저에서 다른 애플리케이션으로 가짜 클라이언트 요청을 전송하는 공격

 

이 CSRF를 예방하기 위해 SOP(동일 출처 정책, Same-Origin Policy)를 구현했다. SOP가 구현된 브라우저는 클라이언트와 동일한 출처의 리소스로만 요청을 보낼 수 있다.

 

하지만 이 SOP는 다른 출처의 리소스를 사용한 경우를 부분적으로 허용해주지 않았기 때문에, CORS가 필요한 것이다.

 

CORS의 작동 방식

브라우저가 Request Message의 Origin 헤더(protocol, domain, port)와 Response Message의 Access-Control-Allow-Origin 헤더(리소스 허용 출처)를 비교하여 CORS를 위반하는 지 확인한다.

 

1. Simple Request

요청 메서드, 요청 헤더, Content-Type 헤더를 담아 요청하는 것. 

 

2. Preflight Request

브라우저가 사전에 OPTIONS 메서드로 요청을 보내어 실제 요청이 안전한지 확인하는 사전 요청.

 

Access-Control-Request-Method로 실 요청 메서드와, Access-Control-Request-Headers 헤더에 실 요청의 추가 헤더 목록을 담아서 보내야 한다.

 

이에 대한 Response는 대응되는 Access-Control-Allow-Methods와 Access-Control-Headers를 보내야 하고, Preflight Request로 인한 추가 요청을 줄이기 위해 캐시 기간을 Access-Control-Max-Age에 담아서 보내야 한다.

 

3. Credential Request

쿠키나 토큰과 같은 인증 정보를 포함한 요청의 경우 안전하게 처리해야 한다.

따라서 서버에서는 Access-Control-Allow-Credentials를 true로 설정해야 하며, Access-Control-Allow-Origin에 와일드카드를 사용할 수 없다.

 

해결 방안

  • 백엔드에서 CORS 허용
    • 개념적으로는 백엔드에 있는 오리진을 브라우저의 origin에 맞춰주겠다는 개념!
  • 프록시 서버 사용
    • 클라이언트가 가상 서버를 앞에 두고, 이와 통신하므로서 CORS 해결
반응형

'Back-end' 카테고리의 다른 글

[Back-End] HTTPS란 정확히 무엇일까?  (1) 2025.01.21
[Back-End] 리버스 프록시 vs 포워드 프록시  (1) 2025.01.13
[Back-End] 갭락(Gap Lock)과 넥스트키 락(Next-Key Lock)  (1) 2025.01.09
[Back-End] DBMS에서 동시성을 제어하는 방법  (1) 2025.01.08
[Back-End] 웹사이트에 처음 접근했을 때 발생하는 일련의 과정  (3) 2025.01.07
'Back-end' 카테고리의 다른 글
  • [Back-End] HTTPS란 정확히 무엇일까?
  • [Back-End] 리버스 프록시 vs 포워드 프록시
  • [Back-End] 갭락(Gap Lock)과 넥스트키 락(Next-Key Lock)
  • [Back-End] DBMS에서 동시성을 제어하는 방법
류건
류건
개발 일지
  • 류건
    건's Dev
    류건
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • Back-end (56)
        • Spring (31)
        • Nest.js (3)
        • Next.js (2)
        • Node.js (3)
      • Infra & Cloud (21)
        • Cloud Computing (6)
        • Docker (3)
        • AWS (7)
      • Java (2)
      • Computer Science (12)
        • Computer Network (0)
        • Operating System (0)
        • 정보 보호와 시스템 보안 (12)
        • Software Architecture (0)
      • 회고록 (4)
        • 우아한테크코스 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CI/CD
    nginx
    db
    Lock
    ddl-auto
    WebClient
    고가용성
    express.js
    EC2
    aws
    Docker
    어노테이션
    public key
    오블완
    Spring Boot
    Webflux
    Nest.js
    Kafka
    Github Actions
    ssl
    node.js
    CORS
    Spring
    https
    CD
    티스토리챌린지
    보안
    JWT
    정보보호
    JPA
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
류건
[Back-End] CORS란 무엇인가요?
상단으로

티스토리툴바