microdot.cors — 교차 출처 리소스 공유(CORS)

한 출처에서 실행되는 JavaScript가 다른 출처에 있는 카메라 호스팅 엔드포인트를 호출할 수 있도록 브라우저가 필요로 하는 헤더를 추가합니다. 이 클래스는 애플리케이션의 OPTIONS 핸들러(프리플라이트 요청용)와 요청 후 훅(일반 응답의 Access-Control-* 헤더용)에 스스로를 연결합니다.

class CORS

class microdot.cors.CORS(app: Microdot | None = None, allowed_origins=None, allow_credentials: bool = False, allowed_methods: list | None = None, expose_headers: list | None = None, allowed_headers: list | None = None, max_age: int | None = None, handle_cors: bool = True)
app

연결할 microdot.Microdot 인스턴스. 연결을 미루기 위해 None 일 수 있으며, 이 경우 나중에 initialize() 를 호출합니다.

allowed_origins

출처 문자열 목록(["https://app.example.com"]) 또는 모든 출처를 허용하는 리터럴 '*'. 이 목록과 일치하지 않는 출처는 CORS 헤더를 받지 못하며, 브라우저는 이를 “이 요청은 허용되지 않음”으로 해석합니다.

allow_credentials

True 이면 Access-Control-Allow-Credentials: true 를 추가하여 브라우저가 교차 출처 요청에 쿠키와 인증 헤더를 보내도록 합니다. 자격 증명이 필요한 요청에는 allowed_origins='*' 와 함께 사용할 수 없습니다(브라우저가 이 조합을 거부합니다).

allowed_methods

브라우저가 교차 출처로 사용할 수 있는 메서드 목록(['GET', 'POST']). None 은 모든 메서드를 의미합니다.

expose_headers

브라우저가 JavaScript에 노출할 수 있는 응답 헤더 이름 목록.

allowed_headers

클라이언트가 교차 출처로 포함할 수 있는 요청 헤더 이름 목록. None 은 모든 헤더를 의미합니다(프리플라이트의 Access-Control-Request-Headers 를 그대로 반영).

max_age

브라우저가 프리플라이트 결과를 캐시할 수 있는 초 단위 시간. 생략하면 브라우저가 매번 프리플라이트를 다시 검증합니다.

handle_cors

False 이면 클래스가 구성되기는 하지만 실제로 자신을 연결하지는 않습니다. get_cors_headers() 출력을 다른 미들웨어와 수동으로 결합하려는 경우에 유용합니다.

initialize(app: Microdot, handle_cors: bool = True)

구성이 미뤄졌던 경우 app 에 연결합니다.

get_cors_headers(request) dict

request 에 적용되는 Access-Control-* 헤더 집합을 계산합니다. 요청 후 훅이 내부적으로 사용하며, 애플리케이션은 커스텀 미들웨어에서 CORS 헤더를 내보낼 때 직접 호출할 수 있습니다.

allowed_origins: list | str | None

구성된 출처 목록 또는 리터럴 '*'. allowed_origins 생성자 인자를 반영합니다. 객체를 다시 만들지 않고 정책을 변경하려면 런타임에 재할당하십시오.

allow_credentials: bool

일치하는 요청에 Access-Control-Allow-Credentials: true 가 내보내지는지 여부. allow_credentials 생성자 인자를 반영합니다.

allowed_methods: list | None

교차 출처로 허용되는 메서드 이름 목록 또는 “모든 메서드”를 의미하는 None. allowed_methods 생성자 인자를 반영합니다.

expose_headers: list | None

브라우저가 JavaScript에 노출할 수 있는 응답 헤더 목록 또는 Access-Control-Expose-Headers 헤더를 생략하는 None. expose_headers 생성자 인자를 반영합니다.

allowed_headers: list | None

교차 출처로 허용되는 요청 헤더 이름 목록(소문자로 변환됨) 또는 “프리플라이트가 요청한 것을 그대로 반영”을 의미하는 None. allowed_headers 생성자 인자를 반영합니다(생성자는 저장하기 전에 목록을 소문자로 변환합니다).

max_age: int | None

브라우저가 프리플라이트 응답을 캐시할 수 있는 초 단위 시간 또는 Access-Control-Max-Age 헤더를 생략하는 None. max_age 생성자 인자를 반영합니다.

예시:

from microdot import Microdot
from microdot.cors import CORS

app = Microdot()
CORS(app,
     allowed_origins=['https://dashboard.example.com'],
     allow_credentials=True,
     max_age=86400)

@app.get('/api/status')
async def status(request):
    return {'ok': True}

프리플라이트 OPTIONS 요청은 자동으로 처리됩니다. 카메라는 적절한 Access-Control-* 헤더와 204 No Content 를 반환합니다. 실제 GET / POST 등의 응답은 등록된 요청 후 훅을 통해 Access-Control-Allow-Origin 헤더를 갖게 됩니다.