您的位置:首页 > Web前端 > JavaScript

Json Web Token——JWT 笔记

2017-07-10 09:54 441 查看
*之前工作中做了cas单点登录模块,对“登录”在无状态协议下的实现有了更加深入的理解,同时对session、cookies的理解也更加深入了。

后来看到一篇讲JWT的文章,文章分2篇,下篇提到了单点登录的实现,我感觉比cas的单点登录更加简单了。写这篇文章做一个学习笔记,记录一下。*

Json Web Token概念

首先理解token的概念,token一般翻译成令牌的意思,大致就是一个小型的密钥,一般具有一定的使用期限。有的时候符号、标记也会被抽象成一个概念,名字也叫做token。

I、Token, an object (in software or in hardware) which represents the right to perform some operation:

1.Tokenization (data security), the process of substituting a sensitive data element

2.Token, an object used in Petri net theory

3.Session token, a unique identifier of an interaction session

4.Security token or hardware token, authentication token or cryptographic token, a physical device for computer authentication

5.Access token, a system object representing the subject of access control operations

6.Token ring, a network technology in which a token circles in a logical ring

7.Invitation token, in an invitation system

II、Lexical token, a word or other atomic parse element

以上是wiki上的释义。它提到了两个概念,一个是计算机软硬件中行使某种权限的权限标示,另一个是词法标记。JWT中用到的明显是第一个。

其次是Json,这是一个Json格式的token,当然了它被重新编码了,形式变化了,但是解码之后还是Json

最后是Web,指的是应用领域,应用范围是浏览器cookies和web服务器。

JWT与传统session机制对比

http是无状态协议,所以我们如果想让服务器知道我们是谁,并且根据之前我的信息简化我本次的操作的话,那么就需要服务器和客户端进行配合来实现“有状态”。

如果说协议是无状态,就好像我去餐厅吃饭,哪怕我们每天都去,那边的服务员都无法记住我们昨天吃了什么,如果你跟他说“服务员上菜,和昨天的一样,记到我帐上”,他做不到。他对任何人的服务态度、服务方式都是一样的,他既不会记得你曾经吃过什么,也不会知道你的账单是哪个,更不会去找你要账。

这个场景用到我们web开发领域就是,http协议他只负责传输,既没有历史记录(你昨天吃了什么)也没有账户密码(你的账单),只要你访问它就根据你的url进行处理,处理完返回结果。你再次访问,他就再次返回。这就是无状态。

如果我们想让他更智能就需要做一些额外的事情。而JWT就是一个实现方式。

传统的session机制是通过编号机制(我自己命名的:P)

http无法记录我们的任何状态,那就必须由服务器来记录了。还是刚刚那个例子,如果服务员记性不好,我们就要在餐厅建立会员机制,餐厅给我们一个会员编号来区分不同的会员,餐厅根据这个编号记录每个会员卡的消费情况、账单情况。每次我们只需要给服务员会员编号他就可以在餐厅的机器也好,纸质账本也好获取到我们的消费信心了。

在web开发领域,就是cookie和session的关系,在我首次访问站点的时候,我们的服务器发送给浏览器一个cookie,浏览器记录了一个cookie存储我们的jsessionID,通过这个 jsessionID可以在服务器找到一个session,里面可以记录各种自定义信息。



图一

如图所示,cookie存储在浏览器,根据站点域名进行划分,不同域名的cookie一般情况下是不会互相混用的(关于cookie的详细机制请自行百度)。

这种传统的session方式就是用户保留会员编号,然后由餐厅记录个人信息的方式。

JWT的方式——会员卡机制(也是我自己瞎命名的:P)

了解了上面的session机制,我们再理解JWT就变的特别简单,其实就是会员卡机制。

这个和session机制的区别就在于,我们自己持有一张卡,而不仅仅是一个编号,卡中可以记录用户的一些信息。当我们拿卡去餐厅的时候,尽管服务员不知道我们是谁,也不知道我们之前的消费信息,但是他一刷卡就可以获取我们的信息了。

在web开发领域,就是cookie里面记录的内容的变化,cookie里面记录我们的消费信息,服务器拿到cookie直接可以获得我们的相应信息,不再需要自行记录,也不需要查询,只需要“解码”和“验证”(这个待会再说)。

举个栗子:

图一是session机制的例子,cookie只记录了session的id,服务器获取到cookie之后需要根据这个cookie获取到对应的session,然后在session里面获取用户信息。

而JWT就是在cookie里面存储更多信息,服务器获取到cookie之后也就获取了更多信息。比如这样:

域名
cookie1123taobao.com
cookie2centeredtengxun.com
jsonwebtokendfjdkjf.cdkjkdd.sdijdcsdn.net
上面表中的jsonwebtoken存储的值是xxxx.xxxx.xxxxx形式的,这是json信息编码的结果。接下来详细解释。

JWT长什么样

ewoJInR5cCI6IkpXVCIsCgkiYWxnIjpTSEExIgp9.ewoJImlzcyI6IkpvaG4gV3Ugand0IiwKCSJpYXQ6MTQ0MTU5MzUwMiwKCSJleHAiOjE0NDU5MzcyMiwKCSJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLAoJInN1YiI6Impyb2NrZXRAZXhheG1wbGUuY29tIiwKCSJteWRhdGExIjoibGFsYWxhIiwKCSJteWRhdGEyIjoicmFyYXJhIgp9.f0c5ab63f5b843f350179949bdfa2e19d84fc2ad


JWT的实现

说了这么多,了解了session机制和JWT与它的区别,但是JWT什么样子还是没有概念。

JWT的编码

JWT使用Base64编码,注意这不是加密,只是把JWT的json格式去除,变成更加紧凑的形式,所以形成了上表中数据形式。

JWT的组成

由三部分组成 :头部、载荷、签名

1.载荷就是会员卡的信息记录部分,记录了用户信息,是一个json格式的数据。

2.头部用于描述这个JWT,使用了什么加密算法等,json格式

3.签名用来验证JWT是否被篡改,保证安全。

这三部分分别被Base64编码后通过“.”连接形成最终的JWT。

头部

例子:

{
"typ":"JWT",//type
"alg":"HS256",//使用的签名算法
}
Base64编码转换后:ewoJInR5cCI6IkpXVCIsCgkiYWxnIjpTSEExIgp9


载荷

例子:

{
"iss":"John Wu jwt",//该JWT的签发者
"iat:1441593502,//什么时候签发的
"exp":144593722,//什么时候过期,这里是UNIX时间戳
"aud":"www.example.com",//接收该JWT的一方
"sub":"jrocket@exaxmple.com",//该JWT所面向的用户
"mydata1":"lalala",//自定义
"mydata2":"rarara"//自定义
}
Base64编码后为:
ewoJImlzcyI6IkpvaG4gV3Ugand0IiwKCSJpYXQ6MTQ0MTU5MzUwMiwKCSJleHAiOjE0NDU5MzcyMiwKCSJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLAoJInN1YiI6Impyb2NrZXRAZXhheG1wbGUuY29tIiwKCSJteWRhdGExIjoibGFsYWxhIiwKCSJteWRhdGEyIjoicmFyYXJhIgp9


签名

将上面的两个编码后的字符串都用句号(英文)——“.”——连接在一起,就形成了:

ewoJInR5cCI6IkpXVCIsCgkiYWxnIjpTSEExIgp9.ewoJImlzcyI6IkpvaG4gV3Ugand0IiwKCSJpYXQ6MTQ0MTU5MzUwMiwKCSJleHAiOjE0NDU5MzcyMiwKCSJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLAoJInN1YiI6Impyb2NrZXRAZXhheG1wbGUuY29tIiwKCSJteWRhdGExIjoibGFsYWxhIiwKCSJteWRhdGEyIjoicmFyYXJhIgp9


然后把上面的字符串用头部里面说明的算法——HS256进行加密,得到:f0c5ab63f5b843f350179949bdfa2e19d84fc2ad。

最终JWT

ewoJInR5cCI6IkpXVCIsCgkiYWxnIjpTSEExIgp9.ewoJImlzcyI6IkpvaG4gV3Ugand0IiwKCSJpYXQ6MTQ0MTU5MzUwMiwKCSJleHAiOjE0NDU5MzcyMiwKCSJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLAoJInN1YiI6Impyb2NrZXRAZXhheG1wbGUuY29tIiwKCSJteWRhdGExIjoibGFsYWxhIiwKCSJteWRhdGEyIjoicmFyYXJhIgp9.f0c5ab63f5b843f350179949bdfa2e19d84fc2ad


怎么使用JWT

上面生成了一个JWT,那么它怎么被使用呢?两种方式:

1、cookie;

2、http协议的Authorization头中。

1.首次登录,提交用户名密码;

2.验证,通过后根据用户信息生成JWT;

3.把JWT返回客户端,设置cookie或者设置到http请求头的Authorization中;

4.每次访问服务器的时候都携带JWT;

5.服务器根据JWT进行验证是否被篡改,没有的话获取信息就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  web json session cookie