本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到1663714611@qq.com
1.cookie:
- 什么是cookie:
- cookie为维护状态(因为http是无状态协议)
- 存储在客户端
- 不能跨域(靠domain,一级域名和二级域名之间是语序共享使用的)
- cookie的重要属性
- name=value(键值对,设置cookie的名称及相对应的值,都必须是字符串类型)
- domain(指定cookie所属域名,默认当前域名)
- path(指定cookie在那个路径下生效,默认是’ / ‘)
- maxAge(失效时间,单位:秒,负数情况cookie为临时cookie,默认‘-1’)
- secure(当设置为true时,cookie在HTTP中无效,在HTTPS中才有效)
- httpOnly(如果给某个cookie设置,则无法通过JS脚本读取该cookie信息,但还能通过Application中手动修改cookie,所以只是在一定程度上可以防止xss攻击,不是绝对的安全)
2.session
- 什么是session
- 是另一种记录服务器和客户端会话状态的机制
- 基于cookie实现,session存储在服务端
- sessionId会被存储到客户端的cookie中
- 认证流程
- 什么是SessionID 1.是Cookie和Session的一道桥梁(验证用户登陆状态)
小结:Cookie与Session的区别
- 安全性(Session好)
- 存取值的类型不同(Cookie只支持字符串数据,想要设置其他类型数据需要将其转成字符串)
- 有效期不同(Cookie可设置为长时间保持,Session(默认是客户端关闭失效)或Session超时失效)
- 存储大小不同(Session远高于Cookie,但访问多时会占用过多的服务器资源)
——————————————————————————————————————————
3.Token(令牌)
- 简单组成:uid(用户唯一的身份标识)+time(时间戳当时的)+sign(签名)
- 特点:
- 服务端无状态、可扩展性好
- 支持移动端设备
- 安全
- 支持跨程序调用
- token身份验证流程图:
- 每一次请求都要携带token,需要把token放到HTTP的Header里
- Token类似一个令牌,无状态的,服务端所需的信息被Base64编码后放到Token中,服务器可以直接解码出其中的数据。
- refresh token(专用于刷新access token的token)工作原理:
小结:token与Session的区别
- token(令牌)服务端无状态化、不会存储会话信息。session(记录服务端和客户端会话状态的机制)服务端有状态化,可记录会话信息。
- 作为身份认证Token安全,如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了。
4.jwt(JSON Web Token)
- jwt是什么
- 是目前最流行的跨域认证解决方案。
- 是一种认证授权机制。
- 可以使用HMAC算法或者RSA的公/私密钥对JWT进行签名。(因为数字签名的存在,这些传递的信息是可信的。)
- Jwt结构:
- Header(是一个Json对象,描述JWT的元数据,通常是下面这样子的) “`Plain Text { “alg”: “HS256”, “typ”: “JWT” }
上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串。
-
#### Payload
Payload部分也是一个Json对象,用来存放实际需要传输的数据,JWT官方规定了下面几个官方的字段供选用。
- iss (issuer):签发人
- exp (expiration time):过期时间
- sub (subject):主题
- aud (audience):受众
- nbf (Not Before):生效时间
- iat (Issued At):签发时间
- jti (JWT ID):编号
当然除了官方提供的这几个字段我们也能够自己定义私有字段,下面就是一个例子
```Plain Text
{
"name": "xiaoMing",
"age": 14
}
默认情况下JWT是不加密的,任何人只要在网上进行Base64解码就可以读到信息,所以一般不要将秘密信息放在这个部分。这个Json对象也要用`Base64URL`算法转成字符串
- Sianature Signature部分是对前面的两部分的数据进行签名,防止数据篡改。 首先需要定义一个秘钥,这个秘钥只有服务器才知道,不能泄露给用户,然后使用Header中指定的签名算法(默认情况是HMAC SHA256),算出签名以后将Header、Payload、Signature三部分拼成一个字符串,每个部分用
.
分割开来,就可以返给用户了。 HS256可以使用单个密钥为给定的数据样本创建签名。当消息与签名一起传输时,接收方可以使用相同的密钥来验证签名是否与消息匹配。 - 认证流程(JWT原理):
- JWT的使用方式: 方法一、 当用户希望访问一个受保护的路由或者资源的时候,可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求头信息的 Authorization 字段里,使用 Bearer 模式添加 JWT。 “`Plain Text GET /calendar/v1/events Host: api.example.com Authorization: Bearer
#### 方法二、
-
#### 跨域的时候,可以把 JWT 放在 POST 请求的数据体里。
#### 方法三、
-
#### 通过过 URL 传输
Plain Text http://www.example.com/user?token=xxx “`
## 小结:Token与JWT的区别
- Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。
- JWT: 将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据。