O que é a API Cookie Store?
A API Cookie Store expõe cookies HTTP a service workers e
oferece uma alternativa assíncrona ao document.cookie
. Com a API,
mais fácil:
- Para evitar instabilidade na linha de execução principal, acesse cookies de forma assíncrona.
- Evite pesquisar cookies, porque é possível observar mudanças nos cookies.
- Acessar cookies de service workers.
Status atual
Etapa | Status |
---|---|
1. Criar explicação | Concluído |
2. Criar um rascunho inicial da especificação | Concluído |
**3. Colete feedback e iterar de acordo com as especificações** | **Em andamento** |
4. Teste de origem | Pausada |
5. Lançamento | Não iniciado |
Como usar o armazenamento de cookies assíncrono?
Ativar o teste de origem
Para testá-la localmente, ative a API na linha de comando:
chrome --enable-blink-features=CookieStore
Transmitir essa sinalização na linha de comando ativa a API globalmente no Chrome para da sessão atual.
Como alternativa, você pode ativar #enable-experimental-web-platform-features
em chrome://flags
.
Você (provavelmente) não precisa de cookies
Antes de mergulhar na nova API, gostaria de afirmar que os cookies ainda são a interface pior primitivo de armazenamento do lado do cliente da plataforma e ainda como último recurso. Não é um acidente. Os cookies foram o primeiro recurso da Web mecanismo de armazenamento do Google Cloud, e aprendemos muito desde então.
Os principais motivos para evitar cookies são:
Os cookies transferem seu esquema de armazenamento para sua API de back-end. Cada solicitação HTTP carrega um snapshot do cookie jar. Isso facilita engenheiros de back-end a fim de introduzir dependências no formato de cookie atual. Uma vez o front-end não poderá alterar o esquema de armazenamento sem implantar uma alteração correspondente no back-end.
Os cookies têm um modelo de segurança complexo. Os recursos da plataforma moderna da Web seguem a mesma política de origem, ou seja, cada aplicativo recebe seu próprio sandbox e é completamente independente e outros aplicativos que o usuário possa estar executando. Escopos de cookies criar uma situação de segurança significativamente mais complexa e apenas tentar resumir que isso dobraria o tamanho deste artigo.
Os cookies têm custos de alto desempenho. Os navegadores precisam incluir um snapshot dos os cookies em cada solicitação HTTP, de modo que toda alteração nos cookies deve ser propagadas pelas pilhas de rede e armazenamento. Os navegadores modernos têm implementações otimizadas de cookies, mas nunca conseguiremos fazer os cookies são tão eficientes quanto os outros mecanismos de armazenamento, que não precisam se comunicar à pilha de rede.
Por todas as razões acima, os aplicativos da Web modernos devem evitar cookies e em vez disso, armazenar um identificador de sessão em IndexedDB adicionar explicitamente o identificador ao cabeçalho ou corpo de solicitações HTTP específicas usando a API fetch.
Dito isso, você ainda está lendo este artigo porque tem uma boa motivo para usar cookies...
Ler um cookie e eliminar a instabilidade
Os veneráveis
document.cookie
A API é uma fonte bastante garantida de instabilidade para o aplicativo. Por exemplo:
sempre que você usa o getter document.cookie
, o navegador precisa parar a execução
JavaScript até que ele tenha as informações de cookie que você solicitou. Isso pode demorar um pouco
ou uma leitura de disco, e vai causar instabilidade na interface.
Uma solução simples para esse problema é mudar da document.cookie
getter à API Cookie Store assíncrona.
await cookieStore.get('session_id');
// {
// domain: "example.com",
// expires: 1593745721000,
// name: "session_id",
// path: "/",
// sameSite: "unrestricted",
// secure: true,
// value: "yxlgco2xtqb.ly25tv3tkb8"
// }
O setter document.cookie
pode ser substituído de maneira semelhante. Observação importante
que a mudança só tem garantia de ser aplicada após a promessa retornada pelo
cookieStore.set
resolve.
await cookieStore.set({name: 'opt_out', value: '1'});
// undefined
Observar, não fazer enquete
Um aplicativo popular para acessar cookies a partir do JavaScript está detectando quando
o usuário faz logout e atualiza a interface. No momento, isso é feito por meio de pesquisas
document.cookie
, que gera instabilidade e tem um impacto negativo na bateria.
vida.
A API Cookie Store oferece um método alternativo para observar cookies que não exigem sondagem.
cookieStore.addEventListener('change', event => {
for (const cookie of event.changed) {
if (cookie.name === 'session_id') sessionCookieChanged(cookie.value);
}
for (const cookie of event.deleted) {
if (cookie.name === 'session_id') sessionCookieChanged(null);
}
});
Dê boas-vindas aos service workers
Devido ao design síncrono, a API document.cookie
não foi feita
disponível para
service workers.
A API Cookie Store é assíncrona e, portanto, é permitida no serviço
trabalhadores
A interação com os cookies funciona da mesma forma em contextos de documentos e service workers.
// Works in documents and service workers.
async function logOut() {
await cookieStore.delete('session_id');
}
No entanto, observar as mudanças dos cookies é um pouco diferente nos service workers. Despertar um service worker pode ser muito caro, então temos que descrever explicitamente o cookie muda o interesse do worker.
No exemplo abaixo, um aplicativo que usa o IndexedDB para armazenar dados do usuário em cache monitora alterações no cookie de sessão e descarta os dados armazenados em cache quando o o usuário faz logout.
// Specify the cookie changes we're interested in during the install event.
self.addEventListener('install', event => {
event.waitUntil(cookieStore.subscribeToChanges([{name: 'session_id'}]));
});
// Delete cached data when the user logs out.
self.addEventListener('cookiechange', event => {
for (const cookie of event.deleted) {
if (cookie.name === 'session_id') {
indexedDB.deleteDatabase('user_cache');
break;
}
}
});
Práticas recomendadas
Em breve.
Feedback
Se você testar essa API, conte para nós o que achou. Direto
feedback sobre o formato da API para
repositório de especificações,
e informar bugs de implementação ao
Blink>Storage>CookiesAPI
Componente Blink.
Estamos especialmente interessados em aprender sobre medidas de desempenho e usar casos além dos descritos na explicação.
Outros recursos
- Explicações públicas
- Especificação
- Rastreamento de bug
- Entrada de chromestatus.com
- Conversa sobre a WCG
- Componente Blink:
Blink>Storage>CookiesAPI