아우라베이스 로고
아우라베이스문서
문서›Edge Functions›Security model

Edge Functions 보안 모델

귀하의 기능, 해당 코드 및 비밀을 비공개로 유지하는 규칙과 귀하가 책임을 지는 장소.

7분 읽기·레벨 중급·2026. 10. 12.에 개정됨
이 영어 텍스트는 프랑스어 원본에서 자동으로 생성되었으며 아직 검토되지 않았습니다.
이 번역 이후 영어 소스가 변경되었습니다. 일부 정보는 최신 정보가 아닐 수 있습니다.
이 페이지는 자동으로 번역되었습니다. 영어 버전은 권위가 있습니다.
#
역할

1. 핵심과 역할

역할열쇠할 수 있다
anon공개 키, 브라우저에서 안전함함수 호출
authenticated공개 키와 로그인한 사용자의 JWT사용자의 신원을 사용하여 함수 호출
service_role비밀 키, 서버 전용모든 것: 배포, 코드 및 비밀 읽기, 작업, 크론, 경고
adminStudio의 콘솔 세션스튜디오의 모든 것

역할은 플랫폼이 검증하는 키와 토큰에서 나옵니다. 클라이언트는 이를 선택할 수 없습니다. 공개 키와 헤더 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에 대해 권한을 부여하고 본문의 값에는 권한을 부여하지 마세요.

aurabase/functions/delete-account/index.tstypescript
Deno.serve((req) => {
  const userId = req.headers.get('x-aura-user-id')
  if (req.headers.get('x-aura-role') !== 'authenticated' || !userId) {
    return new Response('Forbidden', { status: 403 })
  }
  // 본문에서 가져온 ID가 아닌 'userId' 계정을 삭제하세요.
  return new Response('ok')
})
#
격리

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에서 새 키를 생성하고 보안 비밀로 배포한 다음 이전 키를 취소하여 키를 순환합니다.
마지막 업데이트 · 2026. 10. 12.