Modelo de segurança do token
Os tokens L402 consistem em duas partes unidas por::
- Macaroon — JSON codificado em base64 contendo
{hash, exp}. Assinado por SHA-256. Não pode ser forjado sem conhecer o preimage. - Preimage — o segredo de 32 bytes que, quando processado com SHA-256, deve corresponder ao hash embutido no macaroon.
Proteção contra replay
l402-kit inclui proteção contra replay integrada. Cada preimage só pode ser usado uma vez:401 Token already used.
Store padrão: Set em memória. Isso significa:
- Reinicializações limpam o store de replay (tokens se tornam reutilizáveis entre reinicializações)
- Múltiplas instâncias não compartilham estado
Expiração do token
Os tokens carregam um campoexp (timestamp Unix em ms). O SDK rejeita tokens expirados automaticamente.
TTL padrão: 1 hora (definido pelo provedor Lightning ao criar a invoice).
HTTPS é obrigatório
Nunca use L402 sobre HTTP simples em produção. O macaroon e o preimage são transmitidos no cabeçalhoAuthorization. Sobre HTTP, eles ficam expostos a atacantes de rede.
Limitação de taxa
O L402 verifica tokens criptograficamente, sem consultar banco de dados — portanto é barato. Mas a criação de invoices Lightning (a resposta 402) chama a API do seu provedor Lightning. Proteja a criação de invoices com um limitador de taxa para evitar DoS:Gerenciamento de segredos
Nunca codifique chaves de API diretamente no código. Use variáveis de ambiente:.env + dotenv (nunca commitado no git).
Autenticação de endpoints administrativos
Se você expõe endpoints de administração ou estatísticas, nunca aceite segredos via parâmetros de query na URL. URLs são registradas por completo por proxies reversos, CDNs e provedores de nuvem — incluindo a query string.Higiene de chaves do Supabase
UseSUPABASE_SERVICE_KEY (somente no servidor) vs SUPABASE_ANON_KEY (seguro para expor aos clientes) corretamente:
| Chave | Uso | Ignora RLS? |
|---|---|---|
anon | Extensão VS Code, clientes no navegador | Não |
service_role | Funções de API no servidor | Sim |
pro_access) devem usar a chave de serviço — nunca a chave anon. Políticas RLS em tabelas sensíveis não devem conceder acesso anon.
Política de Segurança de Conteúdo
Se você serve um frontend junto com sua API, certifique-se de que seu CSP não bloqueie o fluxo L402:Gerenciamento de dados — exclusão de dados do usuário
Os usuários podem excluir todo o histórico de pagamentos e a assinatura Pro de dentro da extensão VS Code a qualquer momento (Configurações → Zona de Perigo). A extensão chama:- Todas as linhas em
paymentsondeowner_address = ? - Todas as linhas em
pro_accessondeaddress = ?
A extensão exige que o usuário digite seu endereço Lightning exatamente antes de o botão de exclusão ser habilitado — confirmação no estilo GitHub para ações destrutivas.
Privacidade e minimização de dados
l402-kit é projetado para coletar o mínimo de dados necessários para operar. Veja o que é armazenado, por quê e como proteger cada campo.O que é armazenado
| Tabela | Campo | Por quê | Sensibilidade |
|---|---|---|---|
payments | preimage | Proteção contra replay + prova de pagamento | ⚠️ Média — faça hash em vez disso (veja abaixo) |
payments | owner_address | Atribuir receita ao endereço Lightning | Baixa — endereços Lightning são públicos |
payments | amount_sats | Estatísticas do painel | Baixa |
payments | endpoint | Análises por endpoint | Baixa–média |
pro_access | address | Verificar assinatura Pro | Baixa — público |
waitlist | email | Enviar e-mails de boas-vindas e lançamento | ⚠️ Alta — PII real, criptografe ou omita |
waitlist | lightning_address | Sinal de identidade opcional | Baixa |
Faça hash dos preimages em vez de armazená-los brutos
O preimage é o segredo de 32 bytes que prova que um pagamento Lightning foi realizado. Armazená-lo bruto significa que uma violação de banco de dados expõe cada prova. Armazene o hash SHA-256 em vez disso — ele já é público (embutido na invoice BOLT11) e suficiente para proteção contra replay:Proteja os e-mails da lista de espera
Endereços de e-mail são os únicos PII verdadeiros no sistema. Opções em ordem crescente de proteção:Prove a propriedade da carteira antes de excluir dados (LNURL-auth)
O endpoint/api/delete-data deve aceitar apenas requisições do proprietário real do endereço Lightning. Use LNURL-auth para provar a propriedade criptograficamente — o usuário assina um desafio do servidor com a chave privada de sua carteira Lightning, sem necessidade de senha ou conta:
Veja o diagrama completo do fluxo para a sequência completa com o estado do Supabase.
Isso garante que ninguém possa excluir os registros de outro usuário, mesmo que conheça o endereço Lightning.
Lista de verificação
Antes de entrar em produção
Antes de entrar em produção
- HTTPS aplicado em todos os endpoints
- Chaves de API em variáveis de ambiente, não no código-fonte
- Endpoints de administração/estatísticas usam autenticação por cabeçalho, não parâmetros
?secret=na URL - Chave
service_roledo Supabase usada no lado do servidor; chaveanonapenas nos clientes - Tabelas sensíveis do Supabase não têm política SELECT para
anon - Endpoint de exclusão de dados (
/api/delete-data) usa chave de serviço, nunca anon - Limitador de taxa na criação de invoices
- Proteção contra replay testada (tente reutilizar um preimage → espere 401)
- Expiração de token testada (defina TTL curto em desenvolvimento, confirme 401 após expiração)
- Preimages armazenados como hashes SHA-256, não como segredos brutos
- E-mails da lista de espera criptografados em repouso ou descartados após o envio
-
/api/delete-dataexige prova de propriedade da carteira via LNURL-auth
Para APIs de alto tráfego
Para APIs de alto tráfego
- Store de replay com Redis (compartilhado entre instâncias)
- Monitoramento das taxas de resposta 402 (pico = potencial DoS)
- Failover do provedor Lightning (BlinkProvider → fallback para LNbitsProvider)
- Monitoramento da página de status do seu provedor Lightning (ex.: status.blink.sv)