Json Web Token - littleboy12580/learning_python GitHub Wiki
介绍
Json Web Token(JWT)是一个很轻巧的规范,该规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息
组成
一个JWT实际上就是一个字符串,它由三部分组成:头部,载荷与签名
头部
JWT的头部一般用于描述该JWT的最基本的信息,例如其类型以及签名所用算法等,可以用JSON表示,示例如下:
{
"typ": "JWT",
"alg": "HS256"
}
该json对象说明这是一个JWT,所用的签名算法是HS256算法;对这个json对象进行Base64编码,之后得到的字符串即为JWT的头部
rSWamyAYwuHCo7IFAgd1oRpSP7nzL7BF5t7ItqpKViM
载荷
首先一个添加好友的请求json示例如下:
{
"iss": "John Wu JWT",
"iat": 1441593502,
"exp": 1441594722,
"aud": "www.example.com",
"sub": "[email protected]",
"from_user": "B",
"target_user": "A"
}
前五个字段都是JWT标准所定义的
- iss:该JWT的签发者
- sub:该JWT所面向的用户
- aud:接收该JWT的一方
- exp:什么时候过期
- iat:在什么时候签发的
将上面的JSON对象进行base64编码可以得到下面的字符串,该字符串即为JWT的载荷(Payload)
eyJpc3MiOiJKb2huIFd1IEpXVCIsImlhdCI6MTQ0MTU5MzUwMiwiZXhwIjoxNDQxNTk0NzIyLCJhdWQiOiJ3d3cuZXhhbXBsZS5jb20iLCJzdWIiOiJqcm9ja2V0QGV4YW1wbGUuY29tIiwiZnJvbV91c2VyIjoiQiIsInRhcmdldF91c2VyIjoiQSJ9
签名
将编码后的头部与载荷用.连接在一起,然后将连接后的新的字符串用HS256(头部里说明的算法)进行加密(此处需要提供一个密钥,自己定),得到的加密后的字符串就是JWT的签名
最后一步签名的过程,实际上是对头部以及载荷内容进行签名,通过这种方式可以保证接收到的内容没有被篡改过,但不能阻止被攻击后的信息暴露;因此JWT适合于向Web应用传递一些非敏感信息,设计用户认证和授权系统等
通过JWT实现简单用户认证
用户认证(User Authentication)即是让用户登录,并且在接下来的一段时间内让用户访问网站是可以使用其账户而不需要再次登录的机制;
过程
用户通过Web表单将自己的用户名和密码发送到服务器的接口(POST请求,SSL加密传输),应用在数据库中核对用户名和密码,核对成功后应用将用户的id座位JWT载荷的一个属性,在签名后将JWT字符串作为该请求Cookie的一部分返回给用户(此处使用HttpOnly属性来避免XSS攻击);在Cookie失效前,用户每次访问应用,应用都会接收到含有JWT的Cookie,应用从请求中提取JWT,检查其有效性,Base64解码,最后读取用户id,对用户请求进行响应
与Seesion方式存储的区别
Session存储需要占用大量服务器内存(一般大型的需要借助缓存),而JWT方式将用户状态分散到了客户端中,可明显减轻服务端压力