Edge Functions 보안 모델
귀하의 기능, 해당 코드 및 비밀을 비공개로 유지하는 규칙과 귀하가 책임을 지는 장소.
1. 핵심과 역할
| 역할 | 열쇠 | 할 수 있다 |
|---|---|---|
anon | 공개 키, 브라우저에서 안전함 | 함수 호출 |
authenticated | 공개 키와 로그인한 사용자의 JWT | 사용자의 신원을 사용하여 함수 호출 |
service_role | 비밀 키, 서버 전용 | 모든 것: 배포, 코드 및 비밀 읽기, 작업, 크론, 경고 |
admin | Studio의 콘솔 세션 | 스튜디오의 모든 것 |
역할은 플랫폼이 검증하는 키와 토큰에서 나옵니다. 클라이언트는 이를 선택할 수 없습니다. 공개 키와 헤더 x-aura-role: service_role를 사용한 호출은 여전히 anon로 함수에 도달합니다.
모든 경로와 해당 역할은 HTTP API 참조에 나열되어 있습니다.
2. 호출만 공개하는 이유
공개 키는 웹이나 모바일 앱에 게시되므로 누구나 읽을 수 있습니다. 무엇을 허용하든 모든 사람이 허용됩니다. 함수 호출은 이를 위해 설계된 작업 중 하나입니다. 코드에 따라 호출자가 수행할 수 있는 작업이 결정됩니다.
함수의 정의를 읽는 것은 다릅니다. 여기에는 종종 비밀을 담고 있는 소스 코드와 환경 변수가 포함되어 있습니다. 작업 및 알림을 나열하면 데이터가 표시됩니다. 작업을 대기열에 추가하면 할당량에 따라 코드가 실행됩니다. 이들 중 어느 것도 공개될 수 없으며 플랫폼은 service_role이 아닌 키에 대해 403을 사용하여 이를 거부합니다.
다른 곳에도 동일한 분할이 존재합니다. Supabase는 Edge Function이 기본적으로 실행되기 전에 사용자의 JWT을 검증하고(verify_jwt = true) CLI 및 플랫폼(docs)을 통해 기능을 배포합니다. Firebase는 IAM 권한(docs)을 사용하여 Admin SDK를 통해 신뢰할 수 있는 서버 환경의 작업을 대기열에 추가합니다. Cloudflare를 사용하면 작업자만 바인딩(docs)을 통해 대기열로 보낼 수 있습니다.
이전 버전의 서비스는 모든 키에 대해 GET /v1/functions 및 GET /v1/functions/{name}에 응답했습니다. 프로젝트가 이 수정 이전 배포에서 실행된 경우 함수의 코드와 변수를 노출된 것으로 처리하고 포함된 비밀을 교체하세요. 를 0.6로 업그레이드하는 방법을 참조하세요.
3. 신원은 위조될 수 없습니다.
함수는 x-aura-role, x-aura-user-id 및 x-aura-project-id에서 호출자를 읽습니다. 플랫폼은 키와 토큰의 유효성을 검사한 후 이를 설정합니다.
- 발신자는 이를 제공할 수 없습니다. 플랫폼은 대소문자에 관계없이 호출의
headers에서 전송된authorization,apikey,x-request-id및x-aura-*헤더를 삭제합니다. 실제 테스트에서x-aura-role: service_role및 위조된authorization을 사용한 호출은authorization없이role: "anon"기능에 도달했습니다. - 다른 사용자 정의 헤더는 그대로 전달됩니다. 이를 사용자 입력으로 처리합니다.
- 작업 및 크론 실행은 ID 헤더 없이 기능에 도달합니다. 사용자가 아닌 플랫폼에 의해 트리거됩니다.
따라서 x-aura-role 및 x-aura-user-id에 대해 권한을 부여하고 본문의 값에는 권한을 부여하지 마세요.
4. 샌드박스
플랫폼이 제공하는 것:
- 각 호출은 고유한 메모리 제한과 벽시계 시간 제한이 있는 자체 V8 격리에서 실행됩니다. 한 호출의 충돌이나 무한 루프는 다른 호출에 영향을 주지 않습니다.
- 호스트의 환경 변수는 보이지 않습니다.
Deno.env.get('PATH')는 실제 실행에서undefined을 반환했습니다. 함수의 변수와 플랫폼의AURABASE_*변수만 존재합니다. - 한 프로젝트의 코드는 다른 프로젝트에서 읽을 수 없습니다. 이를 제공하는 서비스에는 내부 토큰이 필요합니다.
- 스크립트를 실행할 수 있는 응답은 샌드박싱 콘텐츠 보안 정책과 함께 제공되며 함수의
Set-Cookie및 CORS 헤더는 삭제됩니다. 응답을 참조하세요.
제공되지 않는 것:
- 제한하지 않으면 외부로 나가는 네트워크는 열려 있습니다.
permissions.allow_net이 호스트를 하나 이상 나열하면 런타임은 그 외 호스트로의fetch를 거부합니다(Requires net access to "host:443"). 기본값인 빈 목록은 아무것도 제한하지 않습니다. 함수에 필요한 모든 호스트를 나열하세요. 플랫폼을 호출한다면 프로젝트 URL도 포함하세요. 목록이 있더라도 사용자 입력에서 온 URL은 항상 검증하세요. - 로그에 있는 자신의 비밀은 보호되지 않습니다. 함수가
console.log로 작성하는 모든 내용은 런타임 로그로 이동됩니다. - 사용자당 제한이 없습니다. 호출 비율 제한은 클라이언트 IP당입니다. 한 사용자가 함수를 여러 번 호출하면 안 되는 경우 직접 확인을 추가하세요.
5. 체크리스트
service_role키는 서버와 CI 암호에만 존재합니다.- 브라우저 번들은 공개 키만 포함합니다. SDK는 기본적으로 브라우저에서
service_role키를 거부합니다. - 모든 함수는 민감한 작업을 수행하기 전에
x-aura-role을 확인합니다. - 비밀은 함수의 변수이며 결코
index.ts에 없습니다. - 외부 URL을 호출하는 함수는 대상의 유효성을 검사합니다.
- Studio에서 새 키를 생성하고 보안 비밀로 배포한 다음 이전 키를 취소하여 키를 순환합니다.