LabHub
学习 学习路径 课程

FastAPI — 타입이 곧 계약이다 · CORS는 로그인 검사가 아니다 · 实验

CORS는 로그인 검사가 아니다

在 LabHub 中继续学习

목표

출처·메서드·헤더의 허용 행렬을 실제 프리플라이트로 검증합니다.

왜 중요한가

프런트엔드에서 응답을 읽지 못하자 모든 출처에 별표를 허용했다. 쿠키를 보내는 요청에서는 정책이 더 복잡해졌고, 개발자는 CORS만 켜면 외부 요청이 차단된다고 오해했다. 이 실습에서는 브라우저의 읽기 정책과 서버 인증을 분리한다. 인증 기능을 대신 만들지는 않는다.

단계

1. /root/work/fa-cors-policy-lab/service.py에서 origin(value)는 http 또는 https URL이며 host가 있고 path·query·fragment·사용자 정보가 없으면 입력 문자열을 반환합니다. 그 외 ValueError입니다. 끝의 /도 path이므로 거절합니다.

처음 한 번 준비하세요. 기존 파일은 덮어쓰지 않습니다.

mkdir -p /root/work/fa-cors-policy-labtest -e /root/work/fa-cors-policy-lab/service.py || cp /opt/fixtures/ten_labs/fa-cors-policy-lab/service.py /root/work/fa-cors-policy-lab/service.pycd /root/work/fa-cors-policy-lab

2. /root/work/fa-cors-policy-lab/service.py에서 origins(values)는 각 항목을 origin으로 검증한 뒤 처음 나온 순서대로 중복을 제거한 새 리스트입니다.

3. /root/work/fa-cors-policy-lab/service.py에서 methods(values)는 GET·POST·PUT·DELETE·OPTIONS만 허용하고 대문자로 바꿔 중복을 제거합니다. 빈 목록이나 그 외 값은 ValueError입니다.

4. /root/work/fa-cors-policy-lab/service.py에서 policy(allowed, credentials)는 credentials가 bool인지 확인합니다. allowed에 '*'가 있으면 ValueError이고, {allow_origins:origins(allowed), allow_credentials:credentials}를 반환합니다.

5. /root/work/fa-cors-policy-lab/service.py에서 create_app(allowed, credentials=True)는 policy를 검증하고 CORSMiddleware를 설정한 앱입니다. GET/POST만 허용하고 Content-Type·X-Request-ID 요청 헤더를 허용하며 X-Trace 응답 헤더를 expose합니다. GET /data는 {ok:True}, X-Trace='trace-1'을 반환합니다.

6. /root/work/fa-cors-policy-lab/service.py에서 preflight_headers(source, method, requested='X-Request-ID')는 Origin, Access-Control-Request-Method, Access-Control-Request-Headers 세 키를 가진 딕셔너리입니다. method는 대문자입니다.

7. /root/work/fa-cors-policy-lab/service.py에서 preflight_status(app, source, method, requested='X-Request-ID')는 TestClient로 /data에 OPTIONS 요청을 보내 HTTP 상태를 반환합니다. 다른 출처·DELETE·X-Secret 헤더는 400이어야 합니다.

8. /root/work/fa-cors-policy-lab/service.py에서 cors_observation(app, source)는 GET /data를 보내 (상태, Access-Control-Allow-Origin 값 또는 None, JSON 본문)을 반환합니다. 허용되지 않은 출처여도 200 본문은 실행되지만 허용 출처 헤더는 없어야 합니다.

참고

8个步骤

  1. 출처 형식을 검증한다
  2. 중복 출처를 제거한다
  3. 메서드를 허용 목록으로 제한한다
  4. 자격 증명과 별표를 함께 허용하지 않는다
  5. 실제 CORS 미들웨어를 단다
  6. 프리플라이트 요청을 만든다
  7. 거절 행렬을 계산한다
  8. CORS와 인증의 차이를 관찰한다