Cross Origin Resource Share

개요

클라이언트와 서버를 독립적으로 운영하다보면, 가장많이 발생하는 이슈가 CORS 이슈이다.

매번 CORS에 대해 처리 시, 환경마다 통신이 안되는 경우가 발생하여 이번에 제대로 파악해보고자 한다.

 

CORS 종류

  • Simple Request
  • Preflight Request
  • Credential Request
  • Non-Credential Request

Simple Request

1. GET, HEAD, POST 중 한 가지 방식을 사용

2. POST일 경우 Content-type이 아래 셋 중 하나를 만족

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

3. 커스텀 헤더를 전송하지 않아야 함

Simple Request는 매우 간단한 형태로 요청되고 응답됩니다. 

서버측에 아래 설정만 해주면된다.

Access-Control-Allow-Origin: * ("*" 사용가능)

 

Preflight Request

브라우저에서 Preflight(예비) 요청을 먼저보내 서버가 응답이 가능한지 확인합니다.(HTTP Method : OPTIONS)

서버응답이 가능하면 실제 요청을 보냅니다.

Preflight(예비)요청에 대한 응답 시 서버측에서는 reasponse header에 Allow 설정을해줘야합니다.

1. Preflight Request는 위의 Simple Request에 해당하는 조건에 만족하면 안된다.(PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH...)

2. 커스텀 헤더설정 가능.

3. 서버측에 아래 부분을 설정해주어야한다.

  • Access-Control-Allow-Origin: http://foo.example ("*" 사용가능)
  • Access-Control-Allow-Methods: POST, GET, OPTIONS
  • Access-Control-Allow-Headers: Content-Type

 

Credential Request

HTTP Cookie와 HTTP Authentication 정보를 인식할 수 있게 해주는 요청.

클라이언트와 서버간의 쿠키정보나 세션정보까지 공유할경우 사용해야한다.

아래설정을 클라이언트측과 서버측에 해주어야합니다.

  • xhr.withCredentials = true
  • Access-Control-Allow-Credentials: true

 

Non-Credential Request

withCredentials : false 인경우

 

참고사항

1. IIS 경우 OPTIONS 가 제한되어있는경우가 있어 web.config 파일에 아래설정

<handlers>

<remove name="OPTIONSVerbHandler" />

<add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="IsapiModule" scriptProcessor="C:\Windows\System32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="None" />

</handlers>

 

2. Preflight 할 경우, 인증정보만 response header에 내려주고 작업을 끝내야한다. 

그리고, 루프백으로 실제 요청을 할때도 response header에 셋팅하고 실제작업을 진행해야한다.

'개발기본' 카테고리의 다른 글

동기 / 비동기 / 블로킹 / 논블로킹  (0) 2020.01.01
웹브라우저의 역할  (0) 2019.12.25
스트림(stream) 이란?  (0) 2019.11.14
버퍼(buffer) 란?  (0) 2019.11.14
API 란?  (0) 2019.11.14

+ Recent posts