cookie session token以及jwt

本文详细介绍了Cookie、Session和Token的概念及其在HTTP无状态协议中的作用,探讨了它们的优缺点。重点阐述了Token的无状态认证方式,以及如何通过设置HttpOnly防止CSRF攻击。此外,还介绍了JWT作为Token的一种实现方式,以及其构成和工作流程。

cookie session token参考文件1
cookie session token参考文件2
因为HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。

  1. cookie是保存在客户端的,只能存储字符串。
  2. session是保存在服务器端,有状态的实现。
    一般cookie和seesion配合实现,验证用户登录状态。
    客户端第一次请求,服务端开辟了一块 Session 空间(创建了Session对象),同时生成一个 sessionId ,并通过响应头的 **Set-Cookie:JSESSIONID=XXXXXXX **命令,向客户端发送要求设置 Cookie 的响应。
    客户端每次向同一个网站发送请求时,请求头都会带上该 Cookie信息(包含 sessionId ), 然后,服务器通过读取请求头中的 Cookie 信息,获取名称为 JSESSIONID 的值,得到此次请求的 sessionId。
    缺点:session机制不能实现负载均衡。cookie也容易遭到csrf的攻击(在cookie中设置httponly=true来防止其他站点恶意攻击,获取cookie)。
  3. token定义
    token 也称作令牌,由uid+time+sign[+固定参数]
    token 的认证方式类似于临时的证书签名, 并且是一种服务端无状态的认证方式, 非常适合于 REST API 的场景. 所谓无状态就是服务端并不会保存身份认证相关的数据。

token组成
uid: 用户唯一身份标识
time: 当前时间的时间戳
sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库
token在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中
首次登录,取数据库查询用户的用户名密码是否匹配,登录成功获得用户的uid,例如使用md5加密算法,对uid进行加密,得到的加密字符串返回给客户端,下次客户端请求带上token,服务端根据加密发构造方法,得到uid然后,再次使用加密算法,看得到的密文是否和返回的token一致。
token的使用
token可以抵抗csrf,cookie+session不行
因为form 发起的 POST 请求并不受到浏览器同源策略的限制,因此可以任意地使用其他域的 Cookie 向其他域发送 POST 请求,形成 CSRF 攻击。在post请求的瞬间,cookie会被浏览器自动添加到请求头中。但token不同,token是开发者为了防范csrf而特别设计的令牌,浏览器不会自动添加到headers里,攻击者也无法访问用户的token,所以提交的表单无法通过服务器过滤,也就无法形成攻击

token有设置到期时间吗token过期处理
设置token的过期事件为2个小时,同时设置refreh-token为4小时,就是当前token已经过期,发送请求时携带用户登录的一些uid等,重新获得一个token

补充:JWT

JWT就是token的一种实现方式,并且基本是java web领域的事实标准。

JWT全称是JSON Web Token。基本可以看出是使用JSON格式传输token

JWT 由 3 部分构成:

Header :描述 JWT 的元数据。定义了生成签名的算法以及 Token 的类型。Payload(负载):用来存放实际需要传递的数据Signature(签名):服务器通过Payload、Header和一个密钥(secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。流程:

在基于 Token 进行身份验证的的应用程序中,用户登录时,服务器通过Payload、Header和一个密钥(secret)创建令牌(Token)并将 Token 发送给客户端,

然后客户端将 Token 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:Authorization: 你的Token。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值