Qual é a melhor maneira de implementar “lembrar de mim” para um site?

Quero que meu site tenha uma checkbox de seleção na qual os usuários possam clicar para que não precisem fazer login sempre que visitarem meu site. Eu sei que precisarei armazenar um cookie em seu computador para implementar isso, mas o que deve estar contido nesse cookie?

Além disso, há erros comuns a serem observados para evitar que esse cookie apresente uma vulnerabilidade de segurança, o que poderia ser evitado enquanto ainda se dava a funcionalidade “lembre-se de mim”?

Melhor Prática de Cookies de Login Persistente Aprimorado

Você poderia usar essa estratégia descrita aqui como melhor prática (2006) ou uma estratégia atualizada descrita aqui (2015):

  1. Quando o usuário efetua login com êxito com o recurso Lembrar-me marcado, um cookie de login é emitido além do cookie padrão de gerenciamento de session.
  2. O cookie de login contém um identificador de série e um token . A série e o token são números randoms unguessáveis de um espaço adequadamente grande. Ambos são armazenados juntos em uma tabela de database, o token está com hash (sha256 está bom).
  3. Quando um usuário não logado visita o site e apresenta um cookie de login, o identificador de série é consultado no database .
    1. Se o identificador de série estiver presente e o hash do token corresponder ao hash desse identificador de série, o usuário será considerado autenticado . Um novo token é gerado, um novo hash para o token é armazenado sobre o registro antigo e um novo cookie de login é emitido para o usuário (não há problema em reutilizar o identificador de série ).
    2. Se a série estiver presente, mas o token não corresponder, será considerado um roubo . O usuário recebe um aviso com palavras fortes e todas as sessões lembradas do usuário são excluídas.
    3. Se o nome de usuário e a série não estiverem presentes, o cookie de login será ignorado .

Essa abordagem fornece defesa em profundidade. Se alguém conseguir vazar a tabela do database, ela não dará ao invasor uma porta aberta para representar os usuários.

Eu armazenaria um ID de usuário e um token. Quando o usuário volta ao site, compare essas duas informações com algo persistente, como uma input de database.

Quanto à segurança, apenas não coloque nada lá que permita que alguém modifique o cookie para obter benefícios extras. Por exemplo, não armazene seus grupos de usuários ou suas senhas. Qualquer coisa que possa ser modificada que possa contornar sua segurança não deve ser armazenada no cookie.

Armazene seu UserId e um RememberMeToken. Quando eles logarem com remember me checked, gerem um novo RememberMeToken (que invalida quaisquer outras máquinas que estejam marcadas, lembre-se de mim).

Quando eles retornarem, procure-os pelo token de lembrar-me e certifique-se de que o UserId corresponda.

Investigando sessões persistentes eu descobri que simplesmente não vale o risco de segurança. Use-o se for absolutamente necessário, mas você deve considerar tal session apenas autenticamente fraca e forçar um novo login para qualquer coisa que possa ser valiosa para um invasor.

A razão é claro, é que seus cookies contendo sua session persistente são tão facilmente roubados.

4 maneiras de roubar seus cookies (a partir de um comentário de Jens Roland na página @splattne base em sua resposta):

  1. Interceptando-o em uma linha não segura (sniffing de pacotes / seqüestro de session)
  2. Ao acessar diretamente o navegador do usuário (via malware ou access físico à checkbox)
  3. Ao lê-lo a partir do database do servidor (provavelmente SQL Injection, mas poderia ser qualquer coisa)
  4. Por um XSS hack (ou exploração do lado do cliente semelhante)