JWT(一):认识 JSON WebToken

JWT(二):使用 Java 实现 JWT

什么是 JWT?

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,作为 JSON 对象在各方之间安全的传递信息。这个信息可以通过数字签名进行验证并信任。JWTs 可以使用密钥(结合 HMAC 算法)或者 使用 RSA 、 ECDSA 加密的公钥私钥对进行签名。

尽管 JWTs 能够在各方之间也提供安全加密,但是仍**专注于签名 Token **。当其他方隐藏了加密 Token 的某些声明时,签名 Token 可以验证声明的完整性。当Token使用公钥私钥对进行签名时,这个签名还能证明只有拥有私钥的一方才是签发它的一方。

什么时候使用 JWT ?

  • 授权:这是 JWT 最普遍的使用场景。当用户登录之后,每次请求中都包含 JWT ,服务端允许用户访问那些只有携带 token 才能访问的路由、服务、资源。目前在单点登录中广泛使用到 JWT ,因为它体积小,且能够在不同域名之间使用。
  • 信息交换: JWT 是一种能够在各方之间安全传输信息的好方式。因为 JWTs 能够签名,比如使用公钥私钥对,你能够确定发送者的身份。另外,签名是使用 Header 和 Payload 通过特定算法计算而来,所以你也可以验证内容是否被篡改。

JWT的结构

JWT 包含三部分,之间以点(.)连接

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

一个典型的 JWT 如同下面这样:

xxxxx.yyyyy.zzzzz

一个真实的 JWT 例子:

Header

Header部分 是一个 JSON 对象,典型的header包含两部分:

  • alg:使用的签名算法,比如 HMAC SHA256 或 RSA
  • typ:token的类型,比如 JWT
{
"alg": "HS256",
"typ": "JWT"
}

最后,用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第一部分

Payload

Payload 部分也是 JSON 对象,用来存放数据。JWT 有7个官方字段:

  • iss (issuer):签发人
  • exp (expiration time):过期时间,以秒为单位
  • iat (Issued At):签发时间,能够算出JWT的存在时间
  • nbf (Not Before):生效时间
  • jti (JWT ID):JWT 的唯一标识。用来防止 JWT 重复。
  • sub (subject):主题(很少使用)
  • aud (audience):token的受众(很少被使用)

除了上面这些字段,还可以自定义私有字段,比如

{
"userId": "1101",
"userName": "张三",
"age": "23"
}

最后,用 Base64Url 将这个 JSON 对象编码后,作为 JWT 的第二部分

Tip: JWT 默认不加密,任何人都可以读取,所以不要把敏感信息存放在这个部分,除非加密过。

Signature

使用 Header 指定的算法对 Header、Payload、密钥三部分进行签名,生成的字符串作为 JWT 的第三部分。

比如使用 HMAC SHA256 算法进行签名:

HMACSHA256(
Base64Url.encode(header) + "." + Base64Url.encode(payload),
secret
)

签名可以用来验证数据是否被篡改,而且如果 token 使用私钥进行了签名,那么该签名还可以验证 JWT 发送者的身份。

怎么使用 JWT ?

客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。

此后,客户端每次请求服务器,都要带上这个 JWT。所以可以把它放在 Cookie 里面自动发送,但是这样并不能跨域,所以更好的做法是放在 HTTP 请求的头信息 Authorization 字段里面。

Authorization: Bearer <token>

另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。

JWT 的特点

  1. JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次
  2. JWT 不加密的情况下,不能将敏感数据写入 JWT
  3. JWT 不仅可以用于认证,也可以用于交换信息
  4. JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦签发了 JWT ,在到期之前就会始终有效
  5. JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
  6. 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

和 Session-Cookie 相比

Session-Cookie 方式:客户端每次请求都使用 cookie 携带 session_id ,服务器根据 session_id 区分不同的会话

JWT 方式:客户端每次请求都使用请求头携带 token,服务器根据 token 区分不同的用户

官网 JWT 介绍

JWT (一):认识 JSON Web Token的更多相关文章

  1. gitlab无法push或clone的错误:JWT::DecodeError (Nil JSON web token): lib/gitlab/workhorse.rb:120:in `verify_api_request!'

    使用源码安装的方式升级gitlib7.14到gitlab-8.13.5中文版,然后push的时候报错: 错误信息如下: Started GET "/gitlab/hushizhi/gitla ...

  2. 把旧系统迁移到.Net Core 2.0 日记 (18) --JWT 认证(Json Web Token)

    我们最常用的认证系统是Cookie认证,通常用一般需要人工登录的系统,用户访问授权范围的url时,会自动Redirect到Account/Login,登录后把认证结果存在cookie里. 系统只要找到 ...

  3. JWT详解-(JSON Web Token教程)

    JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法. 一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密 ...

  4. Hacking JWT(JSON Web Token)

    0x01 JWT工作流程 JSON Web Token(JWT)是一个非常轻巧的规范. 这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. JWT常被用于前后端分离,可以和Restful ...

  5. JSON Web Token (JWT) 简介

    JSON Web Token (JWT) 是一种基于 token 的认证方案. JSON Web Token 的结构 一个 JWT token 看起来是这样的: eyJhbGciOiJIUzI1NiI ...

  6. JSON Web Token (JWT) 实现与使用方法

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  7. Python 生成 JWT(json web token) 及 解析方式

    一.关于 jwt 的原理及概念可以自行在网络上搜索了解一下,这里推荐一篇写的比较好的博客 深入了解Json Web Token之概念篇 另附 JWT 的官方文档: https://jwt.io/int ...

  8. [转] JSON Web Token in ASP.NET Web API 2 using Owin

    本文转自:http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/ ...

  9. JSON Web Token in ASP.NET Web API 2 using Owin

    In the previous post Decouple OWIN Authorization Server from Resource Server we saw how we can separ ...

  10. JSON Web Token 使用详解

    JWT 是什么? JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案.它是有三部分组成,示例如下,具体的讲解如下(jwt 是不会有空行的,下面只是为了显示,便使用了换行看着比较 ...

随机推荐

  1. LightOJ 1123 Trail Maintenance

    题意:n个城市m天.每一天修一条道路,输出当前天数的最小生成树,但是这里有一个条件,就是说最小生成树必须包括全部n个城市,否则输出-1 思路:边数有6000如果每一天跑一次最小生成树的话就接近O(m^ ...

  2. 为你的 SuperSocket 启用动态语言

    步骤如下: 1.添加 DLR (dynamic language runtime) 配置片段; Section 定义: <section name="microsoft.scripti ...

  3. 解决Pycharm中SystemError报错

    报错描述- 代码逻辑大致是, 开启线程, 监听kafka生产者push的topic消息.- 问题出现在监听过程中, 线程在接收几条topic之后出现报错, 不再处理数据12报错代码Exception ...

  4. POJ 1321 深搜dfs

    思路其实挺简单的,为什么我想不到呢!!! 原因分析:(1)题目还是做少了 (2)做题目的时候在放音乐 (3)最近脑袋都不愿意想思路总是想一些无用的 改进:(1)以后做题目坚决不开音乐,QQ直接挂隐身 ...

  5. Vue 循环为选中的li列表添加效果

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Vu ...

  6. zshrc配置

    大部分没有改动 # If you come from bash you might have to change your $PATH. # export PATH=$HOME/bin:/usr/lo ...

  7. springboot中使用spring-session实现共享会话到redis(二)

    上篇文章介绍了springboot中集成spring-session实现了将session分布式存到redis中.这篇在深入介绍一些spring-session的细节. 1.session超时: 在t ...

  8. 前端css图片固定宽高问题

    img需要宽高都固定时,图片往往会因此变形,此时可采用的方法有: 上述代码会使得图片居中,边缘部分不显示.这是在图片大小跟container大小差不多的情况下.如果图片很大的话,只显示中心部分是不行的 ...

  9. Team Foundation Server 2015使用教程【2】:默认团队成员添加

    官方文档:https://www.visualstudio.com/en-us/docs/setup-admin/add-users

  10. from __future__ import print_function的使用

    1.作用:把下一个新版本的特性导入到当前版本,就可以在当前版本中测试一些新版本的语法特性,例如在python2的环境下加入这一句可以测试python3的输出语法 2.使用方式:置于程序的第一行 3.示 ...