Um guia completo para JWT

O que é JWT?

JWT (JSON Web Token) é um padrão aberto e o número padrão é RFC7591. Usado para transferir informações com segurança entre diferentes entidades. É baseado em tokens codificados em JSON.

A composição do JWT

O JWT consiste em três partes: Cabeçalho, Carga útil e Assinatura.

  1. O cabeçalho contém o tipo de token (typ) e o algoritmo de assinatura utilizado (alg), que geralmente é representado pela codificação Base64. Os exemplos são os seguintes:
{
  "alg": "HS256",
  "typ": "JWT"
}
  1. A carga útil é a principal parte de armazenamento de informações do token e contém várias declarações para representar informações sobre a entidade (usuário, dispositivo ou outro assunto) e outros dados suplementares. A carga útil pode conter declarações padrão (por exemplo: iss, sub, exp, nbf, iat, aud, etc.) ou declarações personalizadas. A carga útil também é codificada em Base64 e transmitida no token. Os exemplos são os seguintes:
{
  "sub": "myapp",
  "name": "oscar",
  "role": "admin"
}
  1. Uma assinatura é um valor hash que usa uma chave para assinar o cabeçalho e a carga útil para garantir que o token não possa ser adulterado. A assinatura normalmente é gerada usando o algoritmo (por exemplo: HMAC, RSA, etc.) e a chave especificada no cabeçalho e é anexada ao final do token como uma string. A verificação de assinatura pode ser usada para verificar a integridade e autenticidade do token.

Observando o processo de geração de JWT em linguagem Java, as etapas são as seguintes:

  1. Gere a string codificada em Base64 do cabeçalho
String header = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}";
String encodedHeader = Base64.getEncoder().encodeToString(header.getBytes());
  1. Gere a string de codificação Base64 do vetor
		String payload = "{\"sub\":\"myapp\",\"name\":\"oscar\"}";
		String encodedPayload = Base64.getEncoder().encodeToString(payload.getBytes());
  1. Depois de usar o ponto .para conectar o cabeçalho e a operadora, use o algoritmo de assinatura para assinar e anexe o conteúdo assinado ao final de toda a string.
		Key secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
		String concatenated = encodedHeader + '.' + encodedPayload;

		Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
		sha256_HMAC.init(secretKey);
		byte[] signature = sha256_HMAC.doFinal(concatenated.getBytes("utf-8"));
		String compact = concatenated + '.' + Base64.getEncoder().encodeToString(signature);

A string completa obtida após a geração é a seguinte:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJteWFwcCIsIm5hbWUiOiJvc2NhciJ9.5z6NoiF7MR999wOPn2NU6HnyPODx66qm5yRT+n8pNHs=

O conteúdo obtido após a decodificação em https://base64.us/ é o seguinte:
Insira a descrição da imagem aqui

Como pode ser visto acima, o token JWT é uma string.

O papel do JWT

JWT é adequado para transmitir informações de autenticação e autorização em solicitações de rede e é frequentemente usado para construir mecanismos de autenticação e controle de acesso sem estado. Depois que o cliente recebe o token, ele pode verificar sua validade decodificando e validando o token e usar as informações nele contidas para autorização e autenticação.

Para resumir, um JWT é um token de segurança codificado em JSON, que consiste em um cabeçalho, carga útil e partes de assinatura que podem ser usadas para transmitir informações entre entidades e verificar a identidade. Ele fornece um mecanismo simples, extensível e independente para lidar com tarefas relacionadas à autenticação e autorização .
JWT também é frequentemente usado para single sign-on, ou seja, após o usuário efetuar login no sistema A, um token é gerado, e então o usuário traz esse token ao acessar outros sistemas, e então pode acessar os sistemas B, C, D , etc.

Vantagens e desvantagens do JWT

  1. Baseado em JSON, fácil de analisar
  2. Conteúdo rico pode ser definido em tokens, fáceis de estender
  3. Anti-adulteração e alta segurança através de criptografia assimétrica e assinaturas digitais
  4. Os serviços de recursos podem usar JWT para concluir a autorização sem depender do servidor de autorização.

deficiência:

  • O token JWT é mais longo e ocupa mais espaço de armazenamento.

Criptografia e descriptografia de JWT

A criptografia e descriptografia do JWT geralmente envolvem as três etapas a seguir:

  1. Criar JWT:
    A criação do JWT requer a preparação de três partes: Cabeçalho, Carga útil e Assinatura. Ao criar um JWT, primeiro codifique em Base64 o cabeçalho e a carga útil e concatene as duas strings codificadas com pontos para formar a primeira parte do JWT. Em seguida, use a chave e o algoritmo de assinatura especificado para assinar a string anterior, gerar uma string de assinatura e conectá-la à string anterior com um ponto para formar a forma final do JWT.

  2. Verifique o JWT:
    O processo de verificação do JWT geralmente inclui as seguintes etapas: Primeiro, Base64 decodifica as partes do cabeçalho e da carga útil do JWT para extrair as informações que eles contêm. Em seguida, uma assinatura é calculada nas partes do cabeçalho e da carga útil usando o mesmo algoritmo e chave usados ​​para criar o JWT. Finalmente, a string de assinatura calculada é comparada com a parte da assinatura no JWT. Se os dois forem iguais, significa que o JWT não foi adulterado e é confiável.

  3. Decodifique o JWT:
    se precisar visualizar os dados contidos no JWT, você pode decodificar em Base64 a primeira parte do JWT para obter as informações de cabeçalho e carga útil. O resultado decodificado geralmente é uma string no formato JSON, que pode ser convertida em um objeto por meio da biblioteca de análise JSON correspondente.

Deve-se observar que as informações de cabeçalho e carga útil no JWT não são criptografadas, apenas codificadas em Base64. Portanto, essas informações podem ser facilmente obtidas. Para proteger a confidencialidade dos dados, a parte do payload geralmente é criptografada por meio de um algoritmo de criptografia, ou seja, é convertida para o formato JWE (JSON Web Encryption). JWE fornece um método de criptografia padronizado para proteger informações confidenciais no JWT. JWE criptografado inclui cabeçalho, chave e texto cifrado criptografado, etc., que precisam ser descriptografados usando o algoritmo e a chave correspondentes.

Em geral, a criptografia e descriptografia do JWT geralmente envolvem as etapas de criação do JWT, validação do JWT e decodificação do JWT. Entre eles, a verificação do JWT pode ser usada para verificar se o JWT foi adulterado para garantir a integridade e credibilidade do JWT. Criptografar a parte da carga útil pode proteger as informações confidenciais no JWT e melhorar a confidencialidade do JWT.



Acho que você gosta

Origin blog.csdn.net/oscar999/article/details/132706309
Recomendado
Clasificación