댓글 검색 목록

[html] CORS 이해

페이지 정보

작성자 운영자 작성일 21-06-21 10:23 조회 1,629 댓글 0

CORS 또는 Cross-Origin Resource Sharing은 개발자를 물릴 수 있는 한 가지 요소입니다. 웹 앱 또는 백엔드 서비스를 만들 때 초기에. 현대의 수표 브라우저 사용자에게 추가 보안을 제공하는 브라우저. 중요한 것은 이것은 순전히 브라우저에 의해 실행되지만 전체적으로는 웹 서버와 웹 브라우저가 역할을 합니다.


예를 들어 CORS는 웹 사이트가 Fetch API 또는 XMLHttpRequest를 통해 다른 사용자가 로그인 할 수 있는 사이트 / 도메인. CORS가 없으면 악성 웹 사이트 세션 데이터, 쿠키, 및 / 또는 기타 잠재적으로 (암호화되기를 바랍니다!) 민감한 데이터.


CORS가 없는 세상에서 어떻게 작동하는지 살펴 보겠습니다.


  • 사용자가 방금 가장 인기 있는 은행 웹 사이트 중 하나 인 "https : //mybank.example"을 방문하여 몇 가지 거래를 완료했습니다.
  • 사용자는 다른 탭에서 "http : //not-suspicious.example"을 방문합니다.
  • 사용자에게 알려지지 않은 not-suspicious.example에는 매우 인기 있는 은행 사이트의 엔드 포인트 목록에 요청을 보내는 스크립트가 포함되어 있습니다. 이 모든 작업은 백그라운드에서 수행됩니다.
  • 사용자 세션 데이터 또는 기타 민감한 사용자 데이터가 포함 된 응답이 돌아 오는 경우 악성 사이트는 이제 사용자를 가장하는 수단을 갖게 됩니다.

이제 동일한 예이지만 CORS가 활성화 된 브라우저에서 :


  • 사용자가 방금 가장 인기 있는 은행 웹 사이트 중 하나 인 "https : //mybank.example"을 방문하여 몇 가지 거래를 완료했습니다.
  • 사용자는 다른 탭에서 "http : //not-suspicious.example"을 방문합니다. 
  • 사용자가 알 수 없는 not-suspicious.example에는 엔드 포인트 목록에 요청을 보내려는 스크립트가 포함되어 있습니다.
  • 그러나 각 요청 전에 사용자의 브라우저는 요청이 가능한지 확인하기 위해 "프리 플라이트 요청"이라는 요청을 보냅니다.
  • 이제 모든 은행이 보안을 유지하고 있다고 가정 해 보겠습니다. 각 API 서버는 응답하고 not-suspicious.example이 신뢰하는 출처가 아님을 브라우저에 알립니다.
  • 이 시점에서 브라우저는 실행 전 요청을 실패한 것으로 간주하고 실제 요청 실행도 중지합니다.


CORS 사용 예제의 마지막 세 지점에서 브라우저는 일하고 공격을 막았습니다. 그러나 그것은 또한 그것의 하나를 강조합니다 약점 : 브라우저가 핵심이지만 쉽게 비활성화 할 수 있습니다 (예 : --disable-web-security 플래그 (Chrome 및 Firefox의 확장을 통해). CORS는 특정 공격 및 사례를 방지하기 위한 또 다른 메커니즘으로 취급되어야 합니다. 비활성화 된 곳도 고려해야 합니다. 그것은 단지의 일부 여야 합니다 서버를 보호하고 사용자를 보호하기 위한 보다 포괄적인 솔루션 데이터.


CORS 사용 예제의 마지막 세 지점에서 브라우저는 작업을 수행하고 공격을 막았습니다. 그러나 그것은 또한 하나를 강조합니다 약점 : 브라우저가 핵심이지만 CORS 시행도 비활성화 됨. 이 메커니즘은 예방을 위한 또 다른 메커니즘으로 취급되어야 합니다. 특정 공격을 보호하기 위한 보다 포괄적인 솔루션의 일부 여야 합니다. 사용자의 데이터를 보호합니다.


이제 CORS없이 어떤 일이 일어날 수 있는지 알았으니, 누군가가 개발 중에 이것을 발견하고 앱을 준비하는 방법을 파헤치십시오.


시작하기 


웹 앱으로 잘 작동하는 프로젝트 아이디어가 있습니다. 너도 현대적이기를 원합니다 — 누가 2021 년에 일반 HTML 사이트를 원하십니까? 그 의미는 자바 스크립트가 필요합니다. 다음으로 구성된 간단한 아키텍처를 결정합니다.

  • 백엔드 서버-Node.js, Python, PHP 등
  • 자바 스크립트 / HTML / CSS 프런트 엔드는 프레임 워크 (React, Vue.js, Angular 등)와 함께 사용할 수 있습니다.

완전한. 간단한 프로토 타입을 만들어 보겠습니다. 여기에서 JSFiddle을 참조하십시오. HTML, CSS 및 JS 파일과 백엔드 용 GitHub Gist.


const API_URL = 'http://localhost:8000'
const button = document.getElementById('do-something')

function getResultEl () {
  return document.getElementById('result')
}

function handleResponse (response) {
  try {
    response = JSON.parse(response)
  } catch (e) {
    // Something went wrong
    console.log({ error: e })
    response = null
  }

  const html = response !== null && response?.length
    // Put our data in a list
    ? response
      .map((item) => `<li>${item.name}</li>`)
      .join('')
    // Or tell us it failed
    : '<li>Could not get response</li>'

  getResultEl().innerHTML = `<ul>${html}</ul>`
}

// Make our button send a request to our backend API
button.onclick = (event) => {
  const xhr = new XMLHttpRequest()
  xhr.open('GET', `${API_URL}/items`)
  xhr.setRequestHeader('Content-Type', 'application/json')
  // Also set any custom headers if you need, such as authentication headers
  // xhr.setRequestHeader('X-My-Custom-Header', 'some-data')
  xhr.onreadystatechange = () => {
    if (xhr.readyState === 4) {
      handleResponse(xhr.response)
    }
  }

  // Send some optional data
  xhr.send()
}


우리의 작업 확인 


이제 모든 것이 설정되었으므로 엔드 포인트가 제대로 작동하는지 다시 확인하겠습니다. 우리 사이트에서 호출 할 때. cURL은 무엇을 말합니까?


$ curl  "localhost:8000/items" -v
> GET /items HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Mon, 07 Jun 2021 21:16:05 GMT
< server: uvicorn
< content-length: 48
< content-type: application/json

[{"name":"One"},{"name":"Two"},{"name":"Three"}]


좋아 보여. 브라우저로 ...하지만 버튼을 눌렀을 때 작동하지 않습니다. 왜? 브라우저의 개발자 도구를 확인해 보겠습니다. 이 경우 우리는 아래 Firefox :


CORS Blocked Firefox 


몇 가지 일이 방금 일어났습니다.


  1. Javascript 파일에서 http : // localhost : 8000의 API 서버에 HTTP 요청을 보냅니다.
  2. 하나가 아니라 두 개의 요청이 전송되었으며 둘 다 서버에서 오류 응답을 반환했습니다.
  3. API 로그를 확인하면 오류 *가 있습니다. 기술적으로 이것은 OPTIONS HTTP 동사를 명시 적으로 허용하고 처리하여 해결할 수 있지만 여전히 동일한 결과를 산출합니다.
INFO: 127.0.0.1:54748 - "OPTIONS /items HTTP/1.1" 405 Method Not Allowed


첫 번째 요청의 요청 헤더를 간략히 살펴보면 CORS도 표시됩니다. 헤더 ( "Access-Control-Request-"로 시작하는 헤더).


CORS Blocked Firefox 


이러한 일련의 이벤트는 직장에서 브라우저의 CORS 시행이었습니다.


그렇다면 브라우저는 무엇을 하고 있습니까? 


정의로 돌아가서 : CORS는 "Cross-Origin Resource Sharing"을 의미합니다.


예에서 볼 수 있듯이 브라우저는 다음에서 요청을 시도합니다. localhost : 63342 (프런트 엔드)에서 localhost : 8000 (백엔드)으로. 이 두 호스트는 다른 "원점"으로 간주됩니다 ( "원점"에 대한 MDN의 전체 정의 참조).


교차 출처 요청이 감지되면 브라우저는 프리 플라이트 요청을 보냅니다. 각 교차 출처 HTTP 요청 전에 실제 요청이 제대로 처리되었습니다. 이것이 우리 예제의 첫 번째 요청이 우리가 자바 스크립트 코드에서 결코 호출하지 않은 OPTIONS 요청.


Chrome의 DevTools에서는 다음이 결합 될 때 더 명확하게 발생하는 것을 볼 수 있습니다. 요청 및 프리 플라이트 요청 :


CORS Blocked Chrome 


백엔드 준비 


좋은 소식 : 백엔드 개발 방법에 따라 CORS 처리가 패키지 설치 및 / 또는 몇 가지 구성 변경만큼 간단합니다.


예를 들어 Javascript 세계에서 koa와 express는 모두 미들웨어를 가지고 있습니다. 빠른 설정이 있는 패키지 :


여기 예제에서는 FastAPI 앱의 스니펫을 그대로 사용하겠습니다. 헤더를 더 간결하게 보여줍니다.


from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()

app.add_middleware(
    # We add the middleware here
    CORSMiddleware,
    # These are the options we give the middleware and they map easily to their
    # associated CORS headers
    allow_origins=['http://localhost:63342, ‘http://localhost’],
    allow_methods=['GET', 'POST']
)


포트가 다른 동일한 도메인에는 새 항목이 필요합니다. 위의 allow_origins 아래의 스니펫에서 localhost 및 localhost : 63342는 백엔드 API를 호출 할 수 있는 URL이기 때문입니다. 데이터.


또한 allow_methods 아래에서 백엔드를 미세 조정할 수 있음을 알 수 있습니다. 특정 방법 만 허용합니다. 예를 들어 이 API 서비스를 잠글 수 있습니다. 추가로 제공하는 간단한 서비스 인 경우 GET 요청 만 수락하여 사용자 입력이 필요 없는 데이터-업무 시간을 제공하는 API 지정된 상점에 대해.


준비가 되었으면 다시 요청 해 보겠습니다. 아래는 프리 플라이트입니다 요청 (옵션) :


완전한. 이제 우리의 기원을 허용하고 허용 된 방법을 보여줍니다. 또한, 요청에서 허용되는 헤더를 보여줍니다. 나열된 허용 헤더 일반적인 기본값이지만 사용 사례에 다른 헤더를 사용해야 하는 경우 access-control-allow-headers : * 또는 지원하려는 모든 헤더를 명시 적으로 나열하십시오.


CORS 관련 헤더의 자세한 목록은 Mozilla 문서를 참조하세요.


바라건대 이것은 명확성을 제공하고 당신이 가질 수있는 질문을 이해하기를 바랍니다. CORS와 그 효과, 그리고 그것을 지원하는 간단한 앱을 얻었습니다. 가있는 건전한 CORS 정책은 단지에서 작은 톱니 바퀴로만 고려되어야 합니다 웹 보안의 세계. 이것은 하나의 특정 공격 벡터 만 보호하므로 서버와 사용자의 데이터를 안전하게 유지하려면 항상 경계해야 합니다.


https://dev.to/useanvil/understanding-cors-5gm5



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.