cors

박성운·2022년 8월 24일
0

CORS란?
브라우저에서는 보안적인 이유로 cross-origin HTTP 요청을 제한한다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의하지 않으면 요청을 허락하고 동의하지 않는 브라우저를 거절 한다.
이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이요해야 하는데, 이를 CORS(cross-origin resource sharing)이라고 분른다. 말하자면 브라우저에서 다른 출처의 리소스를 공유하는 방법이다.

출처가 무엇인가?
그걸 알기 위해서는 URL의 구조를 알아야한다.
http://host:port/path/../..?QueryString#Fragment 으로 이루어져 있다.
출처란 URL 구조에서 Protocol,Host, Port를 합친 것을 말한다.

cors는 어떻게 동작하나?
simple request인 경운
1. 서버로 요청을 합니다.
2. 서버의 응답이 왔을 때 브라우저가 요청한 origin과 응답한 헤터 Access-control-request-headers의 값을 비교하여 유효환 요청이라면 리소스를 응답합니다. 만약 유효하지 않은 요청이라면 브라우저에거 이를 막고 에러가 발생 합니다.

simple request란?
prefligt 요청 없이 바로 요청한다.
HTTP method가 다음 중 하나이면서
Get
Head
Post

자동으로 설되는 헤더는 제외하고, 설정할 수 있는 다음 헤더들
accept
accept-language
content-language
content-type
만 허용된다.

Content-Type 이 다음과 같은 경우
application/x-www-form-urlendcoded
multipart/for-data
text/plain

preflight 요청일 경우
1.
Origin 해더에 요청출처
Access-Control-Request-Method 헤더에 요청한 HTTP method
Access-Control-Request-Headers 요청 시 사용할 헤더를 Options methid로 서버 요청
2.
브라우저가 서버에 응답한 헤더를 보고 유효한 요청인지 확인한다. 만약 유효하지 않은 요청일 경우 에러가 발생된다.

preflight 요청이란?
실제 요청을 보내는 것이 안전한지 확인하기 위해 먼저 OPIONS메서드를 사용하여 cross-origin HTTP 요청을 보낸다. 사용자 데이터에 영향을 미칠 수 있는 요청이므로 사전에 확인 후 요청을 보낸다.

요청 헤더 목록
-origin
-access-control-request-method
preflight 요청을 한때 실제 요청에서 어떤 메서드를 사용할 것인지 서버에거 알리기 위해 사용됨
-access-cotnrol-request-headers
preflight 요청을 할 때 실제 요청에서 어떤 header를 사용할 것인지 서버에거 알리기 위해 사용됩니다.

응답 헤더 목록
-Access-cotnrol-allow-origin
브라우저가 해당 origin이 자원에 접근할 수 있도록 허용합니다. 혹은 * 은 credentials이 없는 요청에 한해서 모든 origin에서 접근이 가능하도록 허용 한다.
-Access-control-expose-headers
브라우저가 액세스 할 수 있는 서버 화이트리스트 헤더를 ㅎ용한다.
-Access-control-max-age
얼마나 오랫동안 preflight 요청이 캐싱 될 수 있는지 나타낸다.
-Access-control-allow-credentials
credentials가 true일 때 요청에 응답이 노출될 수 있는지를 나타낸다.
preflight 요청에 대한 응답의 일부로 사용되는 경우 실제 자격 증명을 사용하여 실제 요청을 수행할 수 있는지를 나타냅니다.
GET 요청은 prefligt 되지 않으므로 자격 증명이 있는 리소스를 요청하면 헤더가 리소스와 함께 반환되지 안ㅅ으면 브라우저에거 응답을 무시하고 웹 콘텐츠로 반환하지 않습니다.
-Access-control-allow-methods
preflight 요청에 대한 응답으로 허용되는 메서드들을 나타낸다.
-access-control-allow-headers
preflight 요청에 대한 응답으로 실제 요청시 사용할 수 있는 HTTP 헤더를 나타낸다.

0개의 댓글