microdot.csrf — CSRF 보호¶
교차 사이트에서 발생하는 상태 변경 요청을 거부합니다. 이 검사는 before_request 훅으로 실행되며, 브라우저가 제공하는 Sec-Fetch-Site 헤더를 사용합니다(microdot.cors.CORS 인스턴스와 함께 사용할 경우, 오래된 브라우저를 위한 대체 수단으로 Origin 헤더를 사용합니다).
class CSRF¶
- class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)¶
- app
설치할
microdot.Microdot인스턴스. 선택 사항이며, 주어지지 않으면 나중에initialize()를 호출합니다.- cors
애플리케이션의 신뢰할 수 있는 출처를 정의하는
microdot.cors.CORS인스턴스.Sec-Fetch-Site를 보내지 않는 브라우저에서Origin헤더로 대체하려면 필요합니다. 선택 사항이며, 없으면Sec-Fetch-Site검사만 적용됩니다.- protect_all
True(기본값)이면GET,HEAD,OPTIONS를 제외한 모든 라우트가 자동으로 보호됩니다. 개별 라우트는exempt()로 예외 처리할 수 있습니다.False이면 기본적으로 어떤 라우트도 보호되지 않으며, 개별 라우트가protect()로 보호를 선택합니다.- allow_subdomains
True이면 애플리케이션 출처의 하위 도메인에서 오는 요청이 허용됩니다(same-siteSec-Fetch-Site, 또는 일치하는 출처 접미사).
- exempt(f)¶
라우트를 CSRF 보호에서 제외하는 데코레이터입니다. 라우트 데코레이터 바로 뒤에 배치하십시오:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
그렇지 않으면 예외 처리될 라우트(예:
GET라우트 또는protect_all=False일 때의 모든 라우트)에 CSRF 보호를 강제하는 데코레이터입니다.
예시:
from microdot import Microdot
from microdot.cors import CORS
from microdot.csrf import CSRF
app = Microdot()
cors = CORS(app, allowed_origins=['https://app.example.com'])
csrf = CSRF(app, cors=cors)
@app.post('/api/save')
async def save(request):
# automatically CSRF-protected
return {'ok': True}
요청은 Sec-Fetch-Site 가 same-origin 또는 none 을 보고할 때(또는 allow_subdomains=True 일 때 same-site) 허용됩니다. 헤더가 없으면 요청의 Origin 이 CORS 허용 목록과 대조됩니다. 두 헤더가 모두 없는 요청은 허용됩니다(브라우저 CSRF의 대상이 아닌 직접 API 호출에서 일반적입니다).