【基础知识】cookie、session、token、jwt原理

一、cookie

1、原理http是无状态协议,为了进行会话跟踪,必须维护一个状态。这种状态需要通过cookie和session去实现。

2、cookie 是不可跨域: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 set-cookie:domain字段)

3、set-cookie字段里的重要属性:

        name=value:键值对,必须是字符串类型(status=enable)

        expires=DATE:Cookie的有效期,当省略expires属性时,Cookie仅在关闭浏览器之前有效(expires=Wed, 13-Mar-2019 12:08:53 GMT)

        Max-Age:expires现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期。

        path=/:限制指定Cookie 的发送范围的文件目录(若不指定则默认为文档所在的文件目录)

        domain=域名:通过domain属性指定的域名可以做到与结尾匹配一致

        Secure:设置web页面只有在HTTPS安全连接时,才可以发送Cookie

        HttpOnly:它使JavaScript 脚本无法获得Cookie。(防xss)

4、cookie存在的问题

cookie数据可以在客户端被截获,所以演进了新的技术,使用Cookie保存不重要的数据信息,然后再使用Session来保存重要的数据。

5、双重cookie防csrf

在用户访问网站页面时,向请求域名注入一个Cookie,内容为随机字符串(例如csrfcookie=v8g9e4ksfhw)。

在前端向后端发起请求时,取出Cookie,并添加到URL的参数中(接上例POST htps://www.a.com/comment?csrfcookie=v8g9e4ksfhw)。

后端接口验证Cookie中的字段与URL参数中的字段是否一致,不一致则拒绝。

二、session

1、session 是基于 cookie 实现的,session 存储在服务器端,sessionID 会被存储到客户端的 cookie 中,当我们完全禁掉浏览器的cookie的时候,服务端的session也会不能正常使用

2、session与cookie的区别

安全性: Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。

存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。

有效期不同: Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。

存储大小不同: 单个 Cookie 保存的数据不能超过 3K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

三、token

1、Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码,token存储在数据库中

2、token和session区别

session使服务器有状态化,token使服务器无状态,不会存储会话信息。

Session 认证只是简单的把 User 信息存储到 Session 里,而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 

四、jwt

1、JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案

2、使用方式:当用户希望访问一个受保护的路由或者资源的时候,可以把它放在 Cookie 里面自动发送,但是这样不能跨域

方式一:

        放在 HTTP 请求头信息的 Authorization 字段里,使用 Bearer 模式添加 JWT。

        由于jwt是自包含的,减少了需要查询数据库的需要

方式二:

        跨域的时候,可以把 JWT 放在 POST 请求的数据体里

方式三:

        通过 URL 传输

3、token和jwt的区别

Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。

JWT:将 Token 和 Payload 加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据

五、常见问题

1、session

用户多时session占用较多的内存,需要定期清理过期session

集群部署时,一个服务器无法获取另一个有session的登录凭证信息

禁用cookie就把sessionid放url参数后门重写url,所以session不一定靠cookie实现

2、token

token 完全由应用管理,所以它可以避开同源策略(同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源)(前提是将token放在请求头中)

token 可以避免 CSRF 攻击(因为不需要 cookie 了)

token可以在cookie或者header中不依赖cookie

注:token 验证的规则是,服务器从请求体(POST)或者请求参数(GET)中获取设置的 token,然后和 Cookie 中的 token 进行比较,一致之后才执行请求。

CSRF 并不能获取 Cookie 中的信息,所以不能获取 Cookie 中的 token,也就不能在发送请求时在 POST 或者 GET 中设置 token,把请求发送到服务器端时,token 验证不通过,也就不会处理请求了。

3、jwt

原理:jwt是token的一种具体实现方式,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,不依赖cookie

1、由于服务器不需要存储 Session 状态,因此使用过程中无法废弃某个 Token 或者更改 Token 的权限。也就是说一旦 JWT 签发了,到期之前就会始终有效,除非服务器部署额外的逻辑

2、JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT的有效期应该设置得比较短

3、减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

4、前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和CSRF问题)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Edward Hopper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值