CORS( Cross-origin Resourcs Sharing )

2024. 2. 26. 11:00·CS
728x90

CORS : Cross-Origin Resource Sharing?

추가 HTTP 헤더를 사용하여 브라우저에게 한 출처에서 실행 중인 웹 응용 프로그램의 다른 출처의 선택된 자원에 대한 접근 권한을 알려주는 메커니즘.이라고 MDN에 나와있지만 좀 어렵다.

예들 들면 현재 도메인과 다른 도메인으로 리소스가 요청되는 경우,

https://domain-a.com에서 제공되는 프런트 엔드 JavaScript 코드가 
XMLHttpRequest를 사용하여 https://domain-b.com/data.json를 요청하게 되면

 

이런 경우 보안상의 이유로 브라우저는 기본적으로 크로스 도메인 요청을 제한하고 있다. 이렇게 제한을 두게 된 까닭은,

옛날의 서버와 클라이언트는 서버에서 내려받은 클라이언트로만 통신을 했기 때문에 보안상의 의심의 여지가 없었다고 한다.

하지만 Single Page Application이 등장하고 웹이 고도화될수록 여러 곳에 있는 리소스를 활용할 필요가 생겼고, same origin 이 아니라 cross origin에서 서버 자원(리소스) 요청을 해야 했다. 

Single Page Application의 경우 비동기 네트워크 통신을 하기 때문에 API 서버와 웹페이지의 서버가 다를 수 있다.

따라서  API 서버로 요청을 할 시에 CORS 제한이 걸리게 된다.

 

- SPA란 ?

SPA는 'Single Page Application'의 약자로 단일 페이지로 구성된 웹 애플리케이션을 말한다. SPA가 등장하기 전 웹 애플리케이션을 구성하던 방식인 서버 사이드 렌더링(SSR)의 경우, 화면에 보여질 리소스를 서버로 요청하고, 서버로 부터 받아온 리소스를 렌더링 했다.

하지만 SPA의 경우 렌더링의 역할을 서버에게 넘기지 않고 브라우저에서 처리하는 방식이다. 웹 애플리케이션에 필요한 모든 정적 리소스를 최초에 한번 다운로드 하고, 이후 새로운 페이지 요청 시 페이지 갱신에 필요한 데이터만을 전달받아 페이지를 갱신하게 된다.

웹 애플리케이션을 개선시키기 위해 개발자들은 브라우저 벤더사들에게 크로스 도메인 요청이 가능하도록 요구했고, 현재는 서버가 Allow 한 범위 내에서 cross origin요청을 허용할 수 있게 됐다. OPTIONS라는 메서드는 서버에서 Allow 하는 조건들을 다 맞추고 있는가를 사전에 서버에 확인하는 역할을 하는 것이다.

 

해결방법 

01. Access-Control-Allow-Origin

간단한 해결 방법은 API 서버의 응답 헤더를 변경해 주는 것이다.

서버의 해더 중 Access-Control-Allow-Origin이라는 프로퍼티에 CORS를 허용해 줄 도메인을 입력할 수 있다. 모든 곳에 CORS를 허용하기 위해서는 '* '(모든 도메인을 의미함)을 입력한다. 

Access-Control-Allow-Origin: *

이 코드를 아래와 같이 선언하고 활용할 수 있다.

const defaultCorsHeaders = {
  "access-control-allow-origin": "*", // 여기가 중요 !
  "access-control-allow-methods": "GET, POST, PUT, DELETE, OPTIONS",
  "access-control-allow-headers": "content-type, accept",
  "access-control-max-age": 18
};

//response.writeHead(statusCode, defaultCorsHeaders);

 

02. Express에서 CORS 허용하기

- Expres 란 ?

Express 사이트(https://expressjs.com)에 가보면, express란 'Node.js를 위한 빠르고 개방적인 간결한 웹 프레임워크' 라고 한다.

 

Express에서 CORS를 허용하기 위해서는 헤더를 직접 변경해 줄 수도 있고,

app.all('/*', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

 

아래와 같이 Express의 CORS미들웨어를 사용할 수 있다.

Express를 활용한다면 헤더를 변경하기보다는 미들웨어 사용이 간편하다.

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

//모든 요청에 미들웨어 스택 cors()를 거치도록 설정한다.
app.use(cors());

// 요청
app.get('/products/:id', function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for all origins!'})
})

// http 서버실행
app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

 

728x90
LIST

'CS' 카테고리의 다른 글

Servlet(서블릿) & Servlet Container(서블릿 컨테이너) 이란?  (2) 2024.02.29
Tomcat Server 외부 접속 허용 방법  (1) 2024.02.26
HTTPS 인증서 만료되었을 경우  (1) 2024.02.26
HTTP와 HTTPS의 차이를 깊게 이해하기  (0) 2024.02.26
WAS 종류  (0) 2024.02.26
'CS' 카테고리의 다른 글
  • Servlet(서블릿) & Servlet Container(서블릿 컨테이너) 이란?
  • Tomcat Server 외부 접속 허용 방법
  • HTTPS 인증서 만료되었을 경우
  • HTTP와 HTTPS의 차이를 깊게 이해하기
Mr. Joo
Mr. Joo
  • Mr. Joo
    삽질의 시작
    Mr. Joo
  • 전체
    오늘
    어제
    • 분류 전체보기 (175) N
      • Flutter (67)
      • Android (9)
      • Swift (4)
      • React (11)
      • 인공지능 (4)
      • CS (10)
      • 개발 뉴스 (67) N
      • IT 기기 (1)
      • 알면 유용한 정보 (2)
  • 인기 글

  • 태그

    오늘의 이슈
    오늘의 뉴스
    Flutter 기초
    Flutter
    앱 개발
    앱
    기술 뉴스
    뉴스
    개발
    앱개발
    개발 뉴스
    이슈
    기술
    Dart 기초
    개발 이슈
    android
    플러터
    react
    DART
    뉴스 모음
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
Mr. Joo
CORS( Cross-origin Resourcs Sharing )
상단으로

티스토리툴바