JavaScript e Cookies
Este artigo explica JavaScript e cookies.
Vamos explicar tudo cuidadosamente, passo a passo, desde o básico dos cookies, leitura e escrita, segurança, até exemplos práticos.
YouTube Video
javascript-cookie.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>JavaScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 .container-flex {
32 display: flex;
33 flex-wrap: wrap;
34 gap: 2em;
35 max-width: 1000px;
36 margin: 0 auto;
37 padding: 1em;
38 background-color: #ffffff;
39 border: 1px solid #ccc;
40 border-radius: 10px;
41 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
42 }
43
44 .left-column, .right-column {
45 flex: 1 1 200px;
46 min-width: 200px;
47 }
48
49 h1, h2 {
50 font-size: 1.2rem;
51 color: #007bff;
52 margin-top: 0.5em;
53 margin-bottom: 0.5em;
54 border-left: 5px solid #007bff;
55 padding-left: 0.6em;
56 background-color: #e9f2ff;
57 }
58
59 button {
60 display: block;
61 margin: 1em auto;
62 padding: 0.75em 1.5em;
63 font-size: 1rem;
64 background-color: #007bff;
65 color: white;
66 border: none;
67 border-radius: 6px;
68 cursor: pointer;
69 transition: background-color 0.3s ease;
70 }
71
72 button:hover {
73 background-color: #0056b3;
74 }
75
76 #output {
77 margin-top: 1em;
78 background-color: #1e1e1e;
79 color: #0f0;
80 padding: 1em;
81 border-radius: 8px;
82 min-height: 200px;
83 font-family: Consolas, monospace;
84 font-size: 0.95rem;
85 overflow-y: auto;
86 white-space: pre-wrap;
87 }
88
89 .highlight {
90 outline: 3px solid #ffc107; /* yellow border */
91 background-color: #fff8e1; /* soft yellow background */
92 transition: background-color 0.3s ease, outline 0.3s ease;
93 }
94
95 .active {
96 background-color: #28a745; /* green background */
97 color: #fff;
98 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
99 transition: background-color 0.3s ease, box-shadow 0.3s ease;
100 }
101 </style>
102</head>
103<body>
104 <div class="container">
105 <h1>JavaScript Console</h1>
106 <button id="executeBtn">Execute</button>
107 <div id="output"></div>
108 </div>
109
110 <script>
111 // Override console.log to display messages in the #output element
112 (function () {
113 // Override console.log
114 const originalLog = console.log;
115 console.log = function (...args) {
116 originalLog.apply(console, args);
117 const message = document.createElement('div');
118 message.textContent = args.map(String).join(' ');
119 output.appendChild(message);
120 };
121
122 // Override console.error
123 const originalError = console.error;
124 console.error = function (...args) {
125 originalError.apply(console, args);
126 const message = document.createElement('div');
127 message.textContent = args.map(String).join(' ');
128 message.style.color = 'red'; // Color error messages red
129 output.appendChild(message);
130 };
131 })();
132
133 document.getElementById('executeBtn').addEventListener('click', () => {
134 // Prevent multiple loads
135 if (document.getElementById('externalScript')) return;
136
137 const script = document.createElement('script');
138 script.src = 'javascript-cookie.js';
139 script.id = 'externalScript';
140 //script.onload = () => console.log('javascript-cookie.js loaded and executed.');
141 //script.onerror = () => console.log('Failed to load javascript-cookie.js.');
142 document.body.appendChild(script);
143 });
144 </script>
145</body>
146</html>
JavaScript e Cookies
Cookie
refere-se a pequenos pedaços de dados armazenados no navegador do usuário. Eles são usados principalmente para os seguintes propósitos:.
- Autenticação do usuário (manter o estado de login)
- Salvar configurações do usuário (idioma, tema, etc.)
- Rastreamento (histórico de navegação, etc.)
No JavaScript, você pode ler e escrever cookies usando document.cookie
.
Criando (escrevendo) cookies
Cookies são criados com a seguinte sintaxe:.
1document.cookie = "username=JohnDoe";
- Este código salva um cookie chamado
"username=JohnDoe"
no navegador.
Criando cookies com data de expiração
Os cookies podem ter uma data de expiração definida. Se nenhuma data de expiração for definida, ele é tratado como um cookie de sessão e é excluído quando o navegador é fechado.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3const cookieText = "username=JohnDoe; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4document.cookie = cookieText;
5console.log(`Cookie Text : ${cookieText}`);
6console.log(`Cookie Value : ${document.cookie}`);
- O atributo
expires
especifica a data de expiração do cookie em formato UTC. - O atributo
path
especifica o caminho para o qual o cookie será enviado./
significa todo o site. - Se você especificar
SameSite=None
, oCookie
será enviado mesmo em requisições entre sites diferentes. No entanto, neste caso, você deve sempre incluir o atributoSecure
. - Ao especificar
Secure
, oCookie
fica restrito apenas à comunicação HTTPS, aumentando a segurança. - Ao acessar
document.cookie
, você pode obter todos osCookies
disponíveis na página atual como uma única string. - Utilizando o
console.log
, você pode verificar a diferença entre os valores reais dosCookies
definidos no navegador e os valores que podem ser recuperados.
Obtendo (lendo) cookies
Você pode recuperar todos os cookies como uma string usando document.cookie
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3document.cookie = "theme=dark; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4
5console.log(document.cookie);
6// Output: "username=JohnDoe; theme=dark"
- O valor retornado por
document.cookie
é uma única string na qual todos osCookies
estão concatenados no formato 'chave=valor;
'. - É conveniente usar uma função para analisar esta string e extrair o valor desejado.
Função para obter o valor de um cookie
1function getCookie(name) {
2 const cookies = document.cookie.split('; ');
3 for (const cookie of cookies) {
4 const [key, value] = cookie.split('=');
5 if (key === name) {
6 return decodeURIComponent(value);
7 }
8 }
9 return null;
10}
11
12console.log(getCookie("username")); // "JohnDoe"
- Esta função divide as chaves e valores usando
split()
e retorna o valor se corresponder à chave especificada. - Ao usar
decodeURIComponent
, é possível recuperar corretamente os caracteres codificados. - Se a chave correspondente não existir, retorna
null
.
Excluindo cookies
Um cookie pode ser excluído configurando sua data de expiração para uma data no passado.
1document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; SameSite=None; Secure";
2
3console.log(document.cookie);
4// Output: "theme=dark"
- Atribuindo um valor vazio a
username
e definindo a data de expiração para o passado, ele será excluído. - Ao excluir um
Cookie
, você também deve corresponder os atributospath
,SameSite
eSecure
aos que foram usados na sua criação. - Neste exemplo,
username
é excluído e outrosCookies
, comotheme=dark
, permanecem.
Opções de cookie
Você pode especificar várias opções para controlar o comportamento de um cookie. As principais são as seguintes:.
Especifica a data de expiração do cookie em formato UTC. Se não for especificado, o cookie se torna um cookie de sessão e é excluído quando o navegador é fechado.
Especifica a data de expiração do cookie em segundos. Isto tem precedência sobre `expires`.
Especifica o caminho para o qual o cookie será enviado. Por exemplo, se você especificar `/admin`, o cookie será enviado apenas para páginas nesse caminho.
Especifica o domínio para o qual o cookie é válido. Normalmente, é definido para o domínio atual, mas você pode aplicá-lo a todos os subdomínios, como `.example.com`.
Quando este atributo é especificado, o cookie é enviado apenas via HTTPS. Para maior segurança, sempre defina este atributo para informações sensíveis.
Controla se os cookies são enviados em solicitações entre sites. Você pode especificar um dos três valores a seguir:.
- `Strict`
Cookies são enviados apenas para solicitações do mesmo site.
- `Lax`
Cookies são enviados para navegação normal, mas com algumas limitações.
- `None`
Cookies podem ser enviados até mesmo para solicitações entre sites. No entanto, o atributo `Secure` também é necessário.
Exemplo: Cookie seguro
1document.cookie = "sessionId=abc123; secure; SameSite=Strict";
- Se você especificar
secure
, oCookie
só será enviado por comunicações via HTTPS. - Se você especificar
SameSite=Strict
, oCookie
não será enviado para requisições entre sites, sendo eficaz como medida de proteção contra CSRF. - Esses atributos de segurança são essenciais para
Cookies
importantes usados para autenticação ou gerenciamento de sessão.
Codificação e decodificação
Como os valores dos cookies podem conter caracteres especiais, é mais seguro usar encodeURIComponent
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3
4const username = "JohnDoe";
5document.cookie =
6 "username=" + encodeURIComponent(username) +
7 "; max-age=604800; path=/; SameSite=None; Secure";
8
9console.log(decodeURIComponent(getCookie("username"))); // "JohnDoe"
- Ao usar
encodeURIComponent
, você pode armazenar espaços, símbolos e afins com segurança em umCookie
. - Ao lê-lo, utilize
decodeURIComponent
para recuperar a string original. - Neste exemplo,
max-age=604800
é usado para definir o período de expiração para 7 dias (604.800 segundos). Este é um método para especificar a data de expiração, semelhante ao uso deexpires
.max-age
pode ser especificado em segundos e muitas vezes é mais fácil de usar.
Exemplo prático: Salvando e carregando um tema
A seguir, um exemplo de salvar o tema selecionado pelo usuário em um cookie e aplicá-lo automaticamente na próxima visita.
1function setTheme(theme) {
2 document.cookie =
3 "theme=" + encodeURIComponent(theme) +
4 "; max-age=604800; path=/; SameSite=None; Secure"; // 1 week
5 applyTheme(theme);
6}
7
8function applyTheme(theme) {
9 document.body.style.backgroundColor = theme === "dark" ? "#333" : "#fff";
10 document.body.style.color = theme === "dark" ? "#fff" : "#000";
11}
12
13function getCookie(name) {
14 const cookies = document.cookie.split('; ');
15 for (const cookie of cookies) {
16 const [key, value] = cookie.split('=');
17 if (key === name) {
18 return decodeURIComponent(value);
19 }
20 }
21 return null;
22}
23
24const savedTheme = getCookie("theme");
25if (savedTheme) {
26 applyTheme(savedTheme);
27}
1<button onclick="setTheme('light')">Light</button>
2<button onclick="setTheme('dark')">Dark</button>
- A função
setTheme
salva o tema selecionado em umCookie
e chama imediatamenteapplyTheme
para atualizar a tela. - A função
applyTheme
altera as cores de fundo e de texto dobody
de acordo com o tema. - Neste exemplo, como
max-age=604800
está definido, a configuração do tema será mantida por uma semana. - Como a seleção do usuário é mantida ao revisitar a página, a experiência do usuário (UX) é aprimorada.
Limitações e cuidados com cookies
Esteja atento aos seguintes pontos ao usar cookies:.
-
Limitações de tamanho O tamanho de um cookie individual é limitado a cerca de 4KB.
-
Limite no número de cookies que podem ser salvos Dependendo do navegador, só é possível salvar cerca de 20 a 50 por domínio.
-
Precauções de Segurança O conteúdo dos
Cookies
é basicamente salvo em texto simples, portanto não é adequado para armazenar informações confidenciais, como senhas. -
Cookies inacessíveis pelo JavaScript Cookies com o atributo
HttpOnly
não podem ser lidos pelo JavaScript por motivos de segurança.
Servidor e Cookies
1Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
Alguns atributos de Cookie
, como HttpOnly
, não podem ser definidos via JavaScript. Esses devem ser definidos no lado do servidor.
Resumo
Manipular Cookies
com JavaScript pode melhorar a experiência do usuário e manter o estado. No entanto, por favor, leve em consideração os pontos a seguir para tratá-los de forma segura e adequada.
-
Armazene apenas as informações mínimas necessárias Do ponto de vista da privacidade e segurança, evite armazenar informações pessoais ou sensíveis e registre apenas os dados necessários.
-
Defina adequadamente os atributos de segurança Defina atributos como
Secure
eSameSite
para evitar ataques entre sites, como XSS e CSRF. -
Codificação e Decodificação de Dados Use
encodeURIComponent
edecodeURIComponent
para armazenar e ler valores deCookie
com segurança, garantindo o correto tratamento de caracteres especiais e japonês.
Ao aprender o modo correto de usar Cookies
, você poderá construir aplicações web mais avançadas e seguras.
Você pode acompanhar o artigo acima usando o Visual Studio Code em nosso canal do YouTube. Por favor, confira também o canal do YouTube.