jwt是一种跨域认证方案
-
一· 跨域认证问题
-
一般互联网用户认证流程是:
- 用户向服务器发送用户名和密码
- 服务器验证通过,在session中存储相关信息
- 服务器想用户电脑返回一个session_id存入cookie中
- 用户每次访问服务器时,服务器会受到cookie信息
- 服务器查看session中的相关信息,确定用户身份
缺点:扩展性差,当跨网站关联时,需要session共享
-
解决方案:
-
一. 将session储存持久化,保存在一个持久层中
- 优点:架构清晰
- 缺点:工作量大,一旦持久层出现问题,就无法使用。
二. 将所有数据保存于客户端,服务器负责接收请求 如:JWT
二. JWT原理:
-
在用户登录后,服务器生成一个JSON字符串,包含了用户信息,用户每次请求,服务器都会验证这个JSON字符串,字符串会被加密
三. JWT结构:
-
实际结构是一个很长的字符串,用 . 分隔成三部分,头部(Header),负载(Payload),签名(Signature)
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJVc2VySWQiOjEyMywiVXNlck5hbWUiOiJhZG1pbiJ 9.Qjw1epD5P6p4Yy2yju3-fkq28PddznqRj3ESfALQy_U
-
- Header
{ "alg": "HS256", "typ": "JWT" }
alg:签名算法,默认hs256
type:令牌类型,统一为JWT
:2. Payload
用于存放需要传递的数据,
官方数据:
iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (Not Before):生效时间 iat (Issued At):签发时间 jti (JWT ID):编号
自定义数据:{ 'name':'zqlaaa' }
-
- signature
对前面数据的签名,防止数据被篡改,
指定一个只有服务器知道的密匙,根据header中的签名算法,生成签名
- signature
-
将这三不份拼成一个字符串,用 . 隔开就组成了一个JWT的JSON对象
四. JWT的使用
-
- 放在cookie中,但是不能实现跨域,放在HTTP的请求头Authorization中
- 放在POST的请求里面
五. JWT特点
-
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
-
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
-
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
-
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
-
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
-
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。