Pular para o conteúdo

Sessão e cookies

Login, cookie de sessão e tokens assinados.

Entrar e sair#

dataforge
route POST "/entrar":
    usuario := body["usuario"] ?? ""
    senha := body["senha"] ?? ""
    given not confere(usuario, senha):
        respond 401 html pagina_de_login("Usuário ou senha não conferem.")
    pronto := Kiln.redirect("/painel")
    respond Kiln.session_start(loja, req, pronto, {"usuario": usuario})

route GET "/sair":
    respond Kiln.session_end(loja, req, Kiln.redirect("/"))

route GET "/painel":
    given (session["usuario"] ?? void) is void:
        redirect "/entrar"
    respond html painel(session["usuario"])

session_start gera um identificador aleatório, guarda os dados e devolve a resposta com o cookie kiln_sidHttpOnly, SameSite=Lax, sete dias. Nos pedidos seguintes, session já vem preenchida.

Uma mensagem honesta no login#

"Usuário ou senha não conferem" — nunca "esse usuário não existe". A segunda forma diz a quem está tentando quais contas existem, e isso é metade do trabalho de invadir uma.

Onde a sessão mora#

Em memória, no processo. Isso significa três coisas concretas:

SituaçãoO que acontece
o processo reiniciatodo mundo é deslogado
dois processos atrás de um balanceadoro visitante desloga a cada pedido
muitas sessões abertastodas ocupam memória, sem expirar sozinhas

Para um site de um processo — que é a maioria — isso é exatamente o certo, e é a razão de não haver configuração nenhuma. Para mais de um processo, guarde a sessão no banco e use Kiln.sign.

Token assinado#

dataforge
token := Kiln.sign({"usuario": "ana", "ate": 1790000000}, SEGREDO)
dados := Kiln.unsign(token, SEGREDO)     // void se foi adulterado

O conteúdo vai legível no token (base64, não criptografia) com uma assinatura HMAC-SHA256. Qualquer alteração invalida — a comparação é feita em tempo constante, para que o tempo de resposta não vaze o prefixo correto.

Não ponha segredo dentro do token. Quem o tem, lê. Ponha o identificador do usuário e a validade; o resto vem do banco.

dataforge
pronto := Kiln.html(pagina)
Kiln.cookie(pronto, "tema", "escuro", 365)
respond pronto
ParâmetroPadrãoPara que
diassessão do navegador0 apaga o cookie
http_onlyyeso JavaScript da página não lê
same_site"Lax"não viaja em requisição de outro site
seguronoponha yes em produção com HTTPS
caminho"/"limita o cookie a um trecho do site

O que este framework não faz por você#

Não há hash de senha embutido. Guardar senha em texto é o erro mais caro que um site comete — use Arcane.Crypto com um algoritmo lento e um sal por usuário, e nunca compare senhas com is.

O Kiln também não expira sessões sozinho. Se a sua aplicação precisa disso, guarde o horário na sessão e confira no middleware.