Self-Hosted Supabase에서 비대칭 JWT 구성 방법
Source: Dev.to
소개
Self‑hosting Supabase는 프로덕션 환경을 완전히 제어할 수 있게 해 주지만, 공식 문서는 호스팅 서비스에 초점을 맞추고 있습니다. 오픈‑소스 버전에서 잘 다루어지지 않은 기능 중 하나는 asymmetric JWT signing(RSA 또는 ECC)입니다. 이 가이드는 자체 호스팅 Supabase 스택에서 비대칭 JWT를 구성하는 방법을 단계별로 안내합니다.
사전 요구 사항
- 실행 중인 자체 호스팅 Supabase 인스턴스 (docker‑compose).
- 각 Supabase 서비스에 대한
docker‑compose.yml파일에 대한 접근 권한. - 선택 사항: 더 쉬운 배포를 위한 Dokploy (예제는 Dokploy 템플릿을 사용).
비대칭 키 생성
작은 스크립트가 키 쌍을 생성하고, JWK 형식으로 변환하며, 필요한 환경 변수를 준비합니다.
curl -sL https://gist.githubusercontent.com/vpcano/28e93b8af3cb36ba3ecd9a397ccf0ab7/raw/33a2769ac9d2ff0b8fa953566ee1fd5a773ec159/supabase-keygen.sh | bash
스크립트:
- 공개/비공개 키 쌍을 생성합니다 (RS256 또는 ES256).
- 선택적인 Key ID (kid) 를 입력하라는 프롬프트를 표시하거나 무작위로 생성합니다.
- 키를 JSON Web Key (JWK) 형식으로 기록합니다.
- 기존
ANON_KEY와SERVICE_ROLE_KEY를 입력받아 새 키로 다시 서명합니다.
출력은 다음과 같은 환경 변수를 제공합니다.
Environment Variables
| Variable | Description | Supabase service / env var |
|---|---|---|
JWT_SIGNING_KEYS | Private + public keys (JWK) | GOTRUE_JWT_KEYS (auth service) |
JWT_METHODS | Enables asymmetric algorithms (e.g., RS256,ES256) | GOTRUE_JWT_VALID_METHODS (auth service) |
JWT_JWKS | Public key in JWK format | PGRST_JWT_SECRET, PGRST_APP_SETTINGS_JWT_SECRET (REST), API_JWT_JWKS (Realtime), JWT_JWKS (Storage) |
ANON_KEY / SERVICE_ROLE_KEY | Replace the previous keys on all services and client apps | – |
Add these variables to the appropriate sections of your docker‑compose.yml, for example:
services:
auth:
environment:
- GOTRUE_JWT_KEYS=${JWT_SIGNING_KEYS}
- GOTRUE_JWT_VALID_METHODS=${JWT_METHODS}
rest:
environment:
- PGRST_JWT_SECRET=${JWT_JWKS}
- PGRST_APP_SETTINGS_JWT_SECRET=${JWT_JWKS}
realtime:
environment:
- API_JWT_JWKS=${JWT_JWKS}
storage:
environment:
- JWT_JWKS=${JWT_JWKS}
JWKS 엔드포인트를 Kong을 통해 노출하기
공개 JWKS 엔드포인트( /auth/v1/.well-known/jwks.json)는 인증 없이 접근 가능해야 합니다. Kong 컨테이너에 볼륨으로 마운트된 Kong 설정 파일(kong.yml)을 편집하십시오.
services:
## Open Auth routes
- name: auth-v1-open-jwks
url: http://auth:9999/.well-known/jwks.json
routes:
- name: auth-v1-open-jwks
strip_path: true
paths:
- /auth/v1/.well-known/jwks.json
plugins:
- name: cors
## Secure Auth routes
# ... (other services)
kong.yml을 업데이트한 후, 모든 Supabase 컨테이너를 재시작하거나 docker compose up -d --force-recreate 명령을 실행하십시오.
설정 확인
-
JWKS 엔드포인트 확인
https:///auth/v1/.well-known/jwks.json에 접속합니다. 다음과 유사한 JSON이 표시되어야 합니다:{ "keys": [ { "alg": "ES256", "crv": "P-256", "key_ops": ["verify"], "kid": "...", "kty": "EC", "use": "sig", "x": "...", "y": "..." } ] } -
사용자 JWT 검사
-
HTTP 헤더 또는 쿠키에서 JWT를 추출합니다.
-
. 에서 디코드합니다.
-
헤더에는 다음과 같은 내용이 포함되어야 합니다:
{ "alg": "ES256", // 또는 "RS256" "typ": "JWT", "kid": "..." }
-
-
서명 검증
공개 키(JWKS JSON)를 jwt.io의 “JWT Signature Verification” 섹션에 붙여넣어 서명이 올바르게 검증되는지 확인합니다.
결론
이제 자체 호스팅 Supabase 배포에 비대칭 JWT 서명을 구성했습니다. 이는 보안을 향상시킵니다(비공개 키가 서버를 떠나지 않음) 그리고 클라이언트가 캐시된 JWKS를 사용해 로컬에서 토큰을 검증할 수 있어 지연 시간을 줄일 수 있습니다.
스크립트나 Kong 구성을 인프라에 맞게 자유롭게 조정하세요. 자체 호스팅을 즐기세요!