CORS 이해

14503 단어
CORS, 또는 소스 간 자원 공유는 개발자에게 해를 끼칠 수 있는 일
웹 응용 프로그램이나 백엔드 서비스를 초기에 만들 때이것은 현대인이 발행한 수표다
브라우저 사용자에게 추가 보안을 제공하는 브라우저입니다.중요한 것은
이것은 완전히 브라우저에 의해 강제로 실행된 것입니다. 비록 하나의 전체이지만, 둘 다 마찬가지입니다.
웹 서버와 웹 브라우저가 역할을 발휘했다.
예를 들어 CORS는 웹 사이트의 실행을 방지하는 데 도움을 줄 수 있다
HTTP 요청(Fetch API 또는 XMLHttpRequest을 통해 다른
사용자가 로그인할 수 있는 사이트/도메인입니다.그 악성사이트
세션 데이터, 쿠키,
및/또는 기타 잠재적(암호화되기를 바랍니다!)민감한 데이터.
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 사용 예제의 마지막 세 가지 점에서 브라우저가 기능을 완료했습니다.
    잡스가 습격을 막았다.그러나 이것 도 그것 의 특징 하나 를 뚜렷이 드러냈다
    단점: 브라우저가 관건이지만 비활성화되기 쉽다.
    Chrome의 --disable-web-security 로고와 Firefox의 확장을 통해.
    CORS는 일부 공격과 사례를 방지하기 위해 다른 메커니즘으로 간주되어야 한다
    만약 그것이 비활성화된다면, 그것도 고려해야 한다.이것은 단지 하나의 과정의 일부분일 것이다
    보다 포괄적인 솔루션으로 서버 및 사용자 보호
    데이터
    CORS 예제가 활성화된 마지막 세 지점에서 브라우저
    임무를 완수하고 습격을 막았다.그러나 이것 도 한 가지 문제 를 뚜렷이 드러냈다
    단점: 브라우저가 중요하지만 CORS 구현이 중요할 수 있음
    병신이런 메커니즘은 질병을 예방하는 또 다른 메커니즘으로 여겨져야 한다
    일부 공격은 보다 포괄적인 보안 솔루션의 일부여야 합니다.
    서버와 사용자의 데이터를 보호합니다.
    이제 CORS가 없으면 무슨 일이 일어날지 알게 됐어요. 어떤 사람이 어떻게 될지 봅시다.
    개발 과정에서 이 점을 발견하고 응용 프로그램을 어떻게 준비하는지 깊이 연구한다.

    개시하다


    네가 프로젝트를 하나 생각하면 인터넷 응용 프로그램으로 잘 활용될 수 있을 것이다.그대도
    현대화를 원한다. 2021년에 간단한 HTML 사이트가 있기를 누가 원하겠는가?이것은
    자바스크립트가 필요해.다음과 같은 간단한 아키텍처를 선택할 수 있습니다.
  • 백엔드 서버 - 노드js, 파이톤, PHP 등
  • Javascript/HTML/CSS 전단에 프레임워크인 React,Vue가 있을 수 있습니다.js, Angular 등
  • 완벽해.원형을 빨리 만들어 봅시다.자세한 내용은 JSFiddle here 참조
    HTML, CSS 및 JS 파일, 백엔드 용this 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는 다음과 같습니다.

    방금 몇 가지 일이 발생했다.
  • Javascript 파일에서 http://localhost:8000에 있는 API 서버에 HTTP 요청을 보냅니다.
  • 보낸 요청은 하나가 아니라 두 개였는데 모두 되돌아왔다
    서버에서 잘못된 응답입니다.
  • API 로그를 검토한 결과 오류가 발생했습니다.*:
  • 기술적으로 명확한 허용과 처리를 통해
    옵션은 HTTP 술어이지만 결과는 동일합니다.
  • INFO: 127.0.0.1:54748 - "OPTIONS /items HTTP/1.1" 405 Method Not Allowed
    
    빠른 보기 첫 번째 요청의 요청 헤더에도 CORS가 표시됩니다.
    제목(액세스 제어 요청-)으로 시작하는 제목)

    이 일련의 이벤트는 브라우저가 작업 중에 CORS를 실시한 결과입니다.

    그럼 브라우저는 뭘 하고 있을까요?


    다시 정의: CORS 대표“Cross-Origin Resource Sharing”.
    예시와 같이 브라우저가localhost:63342(프런트엔드)-localhost:8000(백엔드).이 두 개
    숙주는 서로 다른'기원'see MDN’s full definition for "origin"으로 여겨진다.
    원점 간 요청이 감지되면 브라우저는 비행 전 요청을 발송합니다
    소스 HTTP 간에 요청할 때마다 실제 요청이 가능한지 확인합니다.
    처리가 적절하다.이것이 바로 왜 우리의 예시 중의 첫 번째 요구는OPTIONS 자바스크립트 코드에서 호출되지 않은 요청입니다.
    Chrome의 개발 도구에서도 이 점을 더욱 분명하게 볼 수 있다
    요청 및 사전 비행 요청:

    백엔드 준비


    좋은 소식은 백엔드의 개발 방식에 따라 COR 처리가 다를 수 있다는 것이다
    패키지 설치 및/또는 일부 구성만 변경하면 됩니다.
    예를 들어 자바스크립트 세계에서 koa와express는 모두 중간부품이 있다
    빠른 설정 기능이 있는 패키지:
  • https://expressjs.com/en/resources/middleware/cors.html#installation
  • https://github.com/koajs/cors
  • 이 예에서는 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 아래 코드 세션에 localhostlocalhost:63342 백엔드 API를 호출할 수 있는 URL이기 때문입니다.
    데이터를 얻다.
    마찬가지로 allow_methods 아래에서 백엔드를 미세하게 조정할 수 있습니다.
    몇 가지 방법만 받아들이다.예를 들어, 이 API 서비스를 잠글 수 있습니다.
    또한
    사용자가 입력할 데이터 없음 - 예를 들어 영업시간을 제공하는 API
    지정한 상점에 대해.
    준비가 되면 다시 한 번 요청을 시도해 봅시다.다음은 비행 전 상황입니다.
    요청(GET:
    완벽해.그것은 이제 우리의 기원을 허락하고 허락할 수 있는 방법을 보여 준다.또한
    요청에 허용되는 제목을 표시합니다.에서 허용되는 제목을 나열했습니다.
    전형적인 기본값이지만, 다른 제목을 사용하려면
    사용 가능OPTIONS 또는
    지원할 모든 제목을 명시적으로 표시합니다.
    CORS 관련 제목에 대한 자세한 목록은 을 참조하십시오Mozilla’s documentation.
    이게 문제가 명확해졌으면 좋겠어요.
    CORS의 효과, 그리고 간단한 응용 프로그램이 그것을 지원했다.하나 있다
    완벽한 CORS 정책은 복합체 중의 작은 톱니바퀴로만 여겨져야 한다
    네트워크 보안의 세계.이것은 특정한 공격 캐리어만 보호하기 때문에,
    사람들은 서버와 사용자 데이터의 안전을 확보하기 위해 경각심을 가져야 한다.
    만약 당신이 사람을 흥분시키는 PDF와/또는 문서 작업을 개발하고 있다면, 우리는 매우 기쁩니다.
    당신의 편지를 받아서 매우 기쁩니다.[email protected]에 전보를 쳐서 우리에게 알려 주십시오.

    좋은 웹페이지 즐겨찾기