Cookies x sessões

188

Comecei a usar o PHP alguns meses atrás. Para criar um sistema de login para o meu site, li sobre cookies e sessões e suas diferenças (os cookies são armazenados no navegador do usuário e as sessões no servidor). Naquela época, eu preferia os cookies (e quem não gosta de cookies ?!) e apenas dizia: "quem se importa? Eu não tenho muito interesse em armazená-lo no meu servidor", então fui em frente e usei cookies para meu projeto de graduação de bacharel. No entanto, depois de fazer a maior parte do meu aplicativo, ouvi dizer que, para o caso particular de armazenar o ID do usuário, as sessões são mais apropriadas. Então comecei a pensar no que diria se o júri me perguntasse por que você usou cookies em vez de sessões? Eu tenho exatamente esse motivo (que não preciso armazenar internamente informações sobre o usuário).? ou é mais do que isso?
Você poderia me falar sobre as vantagens / desvantagens do uso de cookies para manter o ID do usuário?

Obrigado por todos vocês no StackOverflow!

Nadjib Mami
fonte
2
Ambos os métodos armazenam dados . Os cookies fazem isso no lado do cliente, ou seja, no armazenamento dos dispositivos dos seus visitantes. As sessões são uma "extensão" inteligente, pois armazenam apenas um ID exclusivo no lado do cliente e todos os dados reais no lado do servidor. Quando eles recebem o ID exclusivo do cookie do cliente, eles sabem quais dados carregar no servidor. Na maioria dos casos, as sessões serão o que você precisa. A propósito, você pode gerenciar os dois com o github.com/delight-im/PHP-Cookie de uma maneira mais moderna.
caw
Além disso, o núcleo do WordPress abandonou o uso de sessões há vários anos e agora usa apenas cookies . Interessante. Gostaria de saber se eles fizeram isso para facilitar a implantação em um conjunto de servidores com balanceamento de carga e / ou reduzir o logoff aleatório devido à coleta de lixo da sessão.
Simon East

Respostas:

228

O conceito é armazenar dados persistentes através de carregamentos de páginas para um visitante da Web. Os cookies armazenam diretamente no cliente. As sessões usam um cookie como uma espécie de chave, para associar-se aos dados armazenados no lado do servidor.

É preferível usar sessões porque os valores reais estão ocultos do cliente e você controla quando os dados expiram e se tornam inválidos. Se tudo fosse baseado em cookies, um usuário (ou hacker) poderia manipular os dados dos cookies e reproduzir solicitações no seu site.

Editar: Não acho que exista qualquer vantagem em usar cookies, além da simplicidade. Veja desta maneira ... O usuário tem algum motivo para saber seu ID #? Normalmente, eu diria que não, o usuário não precisa dessas informações. A divulgação de informações deve ser limitada com base na necessidade de conhecimento. E se o usuário alterar seu cookie para ter um ID diferente, como seu aplicativo responderá? É um risco de segurança.

Antes das sessões serem a fúria, eu basicamente tinha minha própria implementação. Eu armazenei um valor exclusivo de cookie no cliente e meus dados persistentes no banco de dados, juntamente com esse valor. Em seguida, nas solicitações de página, correspondi a esses valores e tive meus dados persistentes sem deixar que o cliente controlasse o que era.

Fosco
fonte
29
@JiminyCricket Eu não acho que isso seja verdade ... se assim for, ninguém usaria variáveis ​​de sessão para armazenar o usuário conectado no momento - e todo mundo faz. Seria um enorme risco de segurança. Certamente, normalmente, o ID da sessão é armazenado como um cookie na máquina cliente e, em seguida, corresponde ao servidor com os dados da sessão. O servidor normalmente não controla as sessões via endereço IP, e sim através de um valor de cookie.
John M.
1
Recentemente, comecei a usar apenas cookies novamente, apenas porque as sessões não carregam páginas se houver outra sendo executada atualmente na mesma sessão, a menos que você preface cada página session_write_close();quando necessário. Rolar seu próprio ID exclusivo e combinar com cookies simples não foi tão difícil e mantém todas as páginas agradáveis ​​e rápidas.
Brian Leishman
Você acha que eu deveria usar sessões para autenticação? Tem algum risco de segurança? Que tal um hacker tentar alterar sua identificação de sessão, como o servidor responderia (suponha que a identificação de sessão suposta seja válida)?
O BL-
Use a sessão e, em seguida, 2FA, pois a sessão pode ser invadida.
Zakir Sajib 13/01
119

Idéias básicas para distinguir entre os dois.

Sessão:

  1. O IDU é armazenado no servidor (ou seja, do lado do servidor)
  2. Mais seguro (por causa de 1)
  3. A expiração não pode ser definida, as variáveis ​​da sessão expiram quando os usuários fecham o navegador. (atualmente é armazenado por 24 minutos como padrão em php)

Biscoitos:

  1. O IDU é armazenado no navegador da web (ou seja, no lado do cliente)
  2. Não é muito seguro, pois os hackers podem acessar e obter suas informações (por causa de 1)
  3. A expiração pode ser definida (consulte setcookies () para obter mais informações)

A sessão é preferida quando você precisa armazenar informações / valores de curto prazo, como variáveis ​​para cálculo, medição, consulta etc.

Os cookies são preferidos quando você precisa armazenar informações / valores de longo prazo, como a conta do usuário (para que, mesmo quando o computador for desligado por 2 dias, a conta deles ainda esteja conectada). Não consigo pensar em muitos exemplos de cookies, pois não são adotados na maioria das situações.

Reyske
fonte
6
Esteja ciente: Esta NÃO é uma boa resposta. Começa bastante bem, mas confunde as coisas e termina com desinformação. Esta não é uma explicação de sessão versus cookies. É uma explicação de sessão vs. sessão + cookie de sessão. Os cookies por si só não são preferidos pelas razões indicadas. Sessões + cookies de sessão são preferidos pelos motivos expostos.
Markus
Outro erro é que você influencia a vida útil da sessão através da configuração do PHP.
markus 18/09
1
Sessões ainda define um cookie no navegador do usuário, então essa explicação lado do servidor-cliente não é exato
Zalaboza
A expiração das sessões pode ser definida facilmente por qualquer aplicativo. O terceiro ponto está errado. Além disso, você esqueceu a quantidade de dados que podem ser armazenados no cookie versus a sessão. Esse é um ponto mais significativo
saran3h
1
IDU de quê?
Simon East
44
SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

COOKIES END DEPENDING ON THE LIFETIME YOU SET FOR IT. SO THEY CAN LAST FOR YEARS

Essa é a principal diferença em sua escolha,

Se você deseja que o ID seja lembrado por muito tempo, é necessário usar cookies; caso contrário, se você quiser que o site reconheça o usuário apenas para esta visita, as sessões serão o caminho a seguir.

As sessões são armazenadas em um arquivo que o servidor php irá gerar. Para lembrar qual arquivo é para qual usuário, o php também definirá um cookie no navegador do usuário que contém o ID do arquivo da sessão, para que na próxima visita o php leia esse arquivo e recarregue a sessão.

Agora, por padrão, o php limpa as sessões a cada intervalo, e também a convenção de nomenclatura da sessão faz com que ela expire automaticamente. Além disso, os navegadores não manterão o cookie que contém o ID da sessão quando o navegador for fechado ou o histórico limpo.

É importante observar que hoje em dia os navegadores também oferecem suporte a outro tipo de mecanismos de armazenamento, como LocalStorage, SessionStorage e outros mecanismos webdb que o código javascript pode usar para salvar dados em seu computador para lembrar de você. Se você abrir o console javascript no Facebook, por exemplo, e digitar "localStorage", verá todas as variáveis ​​que o Facebook usa para se lembrar de você sem cookies.

Zalaboza
fonte
16
Na verdade, por padrão, uma sessão dura até o usuário fechar o navegador, mas isso pode ser alterado no arquivo php.ini, alterando 0 em session.cookie_lifetime = 0 para o número de segundos que você deseja que a sessão dure ou usando session_set_cookie_params ().
DOK
1
Mais informações úteis, essa pergunta que recebe muitas respostas .. ótimo, obrigado novamente DOK!
Nadjib Mami 06/06
1
Lembre-se também do ponto único de falha que os arquivos de sessão podem criar. Quando mesmo o menor ataque do tipo DOS acontece por meio de proxy, switcher ip ou zumbis, um arquivo de sessão é criado no disco rígido ou no ssd do servidor. Se você não conseguir acompanhar as gravações de leitura, o site será desativado.
Shawn E Carter
alguém pode clafiry: "SESSÕES TERMINAM QUANDO O USUÁRIO FECHA O SEU NAVEGADOR" 1. e se o usuário navegar em qualquer página da página .. e depois voltar sem fechar o navegador. 2. e se eles tiverem várias janelas / guias do navegador abertas apontando para o mesmo site? alguns aplicativos da web no trabalho ficam confusos nessa situação, mas não sei que tipo de cookies eles usam.
jcansell
1
@jcansell bem, um cookie não vai ficar confuso com múltiplas abas ou navegar para longe, em tal caso, muito provavelmente, estes webapps utilizados armazenamento localStorage / sessão para salvar os dados usando javascript
Zalaboza
20

quando você salva o #ID como cookie para reconhecer usuários conectados, na verdade você está mostrando dados para usuários que não estão relacionados a eles. Além disso, se um terceiro tentar definir IDs aleatórios como dados de cookie em seu navegador, ele poderá convencer o servidor de que é usuário enquanto não é. Isso é falta de segurança.

Você usou cookies e, como disse, já concluiu a maior parte do projeto. Além disso, o cookie tem o privilégio de permanecer por um longo tempo, enquanto as sessões terminam mais rapidamente. Portanto, as sessões não são adequadas neste caso. Na realidade, muitos sites e serviços famosos e populares usam cookies e você pode permanecer conectado por um longo tempo. Mas como você pode usar o método deles para criar um processo de logon mais seguro?

aqui está a idéia: você pode ajudar a usar cookies: se você usar chaves aleatórias em vez de IDs para reconhecer usuários logados, primeiro não vazará seus dados primários para usuários aleatórios e, em segundo lugar, se você considerar o item Aleatório chave grande o suficiente, será mais difícil para alguém adivinhar uma chave ou criar uma aleatória. por exemplo, você pode salvar uma chave de 40 comprimentos como esta no navegador do usuário: "KUYTYRFU7987gJHFJ543JHBJHCF5645UYTUYJH54657jguthfn" e será menos provável que alguém crie a chave exata e finja ser outra pessoa.

Makan Tayebi
fonte
1
Boa explicação. Eu uso o GUID no token para reconhecer usuários individuais.
Karthik
16

Resposta curta

Regras ordenadas por prioridade:

  • Regra 1. Nunca confie na entrada do usuário: os cookies não são seguros. Use sessões para dados confidenciais.
  • Regra 2. Se os dados persistentes devem permanecer quando o usuário fecha o navegador, use cookies.
  • Regra 3. Se os dados persistentes não precisarem permanecer quando o usuário fechar o navegador, use as sessões.
  • Regra 4. Leia a resposta detalhada!

Fonte: https://www.lucidar.me/en/web-dev/sessions-or-cookies/


Resposta detalhada

Biscoitos

  • Os cookies são armazenados no lado do cliente (no navegador do visitante).
  • Os cookies não são seguros: é muito fácil ler e escrever o conteúdo dos cookies.
  • Ao usar cookies, você deve notificar os visitantes de acordo com as leis européias (GDPR).
  • A expiração pode ser definida, mas o usuário ou o navegador pode alterá-la.
  • Os usuários (ou navegador) podem (ser configurados como) recusar o uso de cookies.

Sessões

  • As sessões são armazenadas no lado do servidor.
  • As sessões usam cookies (veja abaixo).
  • As sessões são mais seguras que os cookies, mas não são invulneráveis.
  • A expiração é definida na configuração do servidor (php.ini, por exemplo).
  • O tempo de expiração padrão é de 24 minutos ou quando o navegador é fechado.
  • A expiração é redefinida quando o usuário atualiza ou carrega uma nova página.
  • Os usuários (ou navegador) podem (ser configurados como) recusar o uso de cookies, portanto, sessões.
  • Legalmente, você também precisa notificar os visitantes sobre o cookie, mas a falta de precedentes ainda não está clara.

A escolha apropriada

As sessões usam um cookie!Os dados da sessão são armazenados no lado do servidor, mas um UID é armazenado no lado do cliente em um cookie. Ele permite que o servidor combine um determinado usuário com os dados corretos da sessão. O UID é protegido e difícil de invadir, mas não é invulgar. Para ações confidenciais (alteração de email ou redefinição de senha), não confie nas sessões nem nos cookies: solicite a senha do usuário para confirmar a ação.

Os dados sensíveis nunca devem ser armazenados em cookies (e-mails, senhas criptografadas, dados pessoais ...). Lembre-se de que os dados são armazenados em um computador estrangeiro e, se o computador não for particular (sala de aula ou computadores públicos), alguém poderá ler o conteúdo dos cookies.

Os dados Lembrar-me devem ser armazenados em cookies, caso contrário, os dados serão perdidos quando o usuário fechar o navegador. No entanto, não salve a senha ou os dados pessoais do usuário no cookie 'lembre-se de mim'. Armazene dados do usuário no banco de dados e vincule esses dados a um par de ID / chave criptografado armazenado em um cookie.

Depois de considerar as recomendações anteriores, a pergunta a seguir é finalmente o que ajuda você a escolher entre cookies e sessões:

Os dados persistentes devem permanecer quando o usuário fecha o navegador?

  • Se a resposta for sim , use cookies .
  • Se a resposta for não , use as sessões .
Fifi
fonte
13

Na verdade, sessão e cookies nem sempre são coisas separadas. Frequentemente, mas nem sempre, a sessão usa cookies.

Há algumas boas respostas para sua pergunta nessas outras perguntas aqui. Como sua pergunta é especificamente sobre como salvar o IDU (ou ID) do usuário, não acho que seja uma duplicata dessas outras perguntas, mas as respostas deles devem ajudá-lo.

cookies vs sessão

Cache VS Sessão VS cookies?

Qual é a diferença entre uma sessão e um cookie?

DOK
fonte
10

Eu pessoalmente uso os cookies e a sessão.

Cookies usados ​​apenas quando o usuário clica na caixa de seleção "lembrar de mim" . e também os cookies são criptografados e os dados somente descriptografam no servidor. Se alguém tentar editar cookies, nosso decodificador poderá detectá-lo e recusar a solicitação.

Eu já vi tantos sites nos quais as informações de login são armazenadas em cookies , qualquer um pode simplesmente alterar o ID do usuário e o nome de usuário nos cookies para acessar qualquer conta.

Obrigado,

Muhammad Sanaullah
fonte
2

Session e Cookie não são os mesmos.

Uma sessão é usada para armazenar as informações das páginas da web. Normalmente, as páginas da web não têm lembranças para armazenar essas informações. Mas usando podemos salvar as informações necessárias.

Mas o Cookie é usado para identificar os usuários. Usando cookie, podemos armazenar os dados. É uma pequena parte dos dados que serão armazenados no navegador da web do usuário. Portanto, sempre que o usuário procurar o navegador da próxima vez, envie de volta as informações dos dados do cookie ao servidor para obter as atividades anteriores.

Créditos: Sessão e Cookie

user3824494
fonte
E se o usuário desativou os cookies? Como o cookie identifica o usuário?
SohailRajput
1

As sessões permitem que você armazene informações individuais como os cookies, mas os dados são armazenados no servidor e não no cliente.

fuddin
fonte
0

Como outros disseram, as sessões são inteligentes e têm mais vantagem de ocultar as informações do cliente.

Mas o cookie ainda tem pelo menos uma vantagem , você pode acessar seus cookies a partir de Javascript (por exemplo, ngCookies ). Com a sessão PHP, você não pode acessá-la em nenhum lugar fora do script PHP.

Kamalakannan J
fonte
1
Você pode .. Não diretamente, é claro, sempre que você puder acessá-lo através de alguma solicitação ajax para script que retorna dados da sessão. Mas não tenho certeza se deveria.
L00k 9/0918
0

Selecionarei Sessão, antes de tudo, a sessão é mais segura do que os cookies, cookies são dados do site do cliente e sessão são dados do site do servidor. Os cookies são usados ​​para identificar um usuário, porque são pequenos pedaços de código incorporados ao meu servidor no navegador do computador do usuário. Por outro lado, a Sessão ajuda a proteger sua identidade porque o servidor da Web não sabe quem você é, pois o endereço HTTP altera o estado 192.168.0.1 para 765487cf34ert8ded… ..ou outra coisa é numerada com a ajuda dos métodos GET e POST. A sessão armazena dados do usuário em uma sessão de ID exclusiva que nem mesmo a ID do usuário pode corresponder. A sessão armazena informações de usuário único em todas as páginas de um aplicativo. Os cookies expiram são configurados com a ajuda de setcookies () enquanto a sessão expirar não é configurada, eles expiram quando o usuário desliga os navegadores.

Wasiq Mahmood WM
fonte
0

Uma sessão é um grupo de informações no servidor associado às informações de cookies. Se você estiver usando PHP, poderá verificar a sessão. salve _ localização do caminho e, na verdade, "veja as sessões". Um cookie é um trecho de dados enviados e retornados de clientes. Os cookies geralmente são usados ​​para facilitar as sessões, pois informa ao servidor qual cliente tratou qual sessão. Existem outras maneiras de fazer isso (query string magic etc), mas os cookies provavelmente são os mais comuns.

Megersa
fonte