Session、Cookie、JWT详解

Cookie和Session的产生原因

为什么会有Cookie和Session,这是一个自然发生的事情,平时在进行开发时,通常使用HTTP或HTTPS协议发送请求到服务端,而学过计算机网络的都知道,HTTP协议是一种无状态的协议,服务端无法从请求本身知道请求方的相应信息状态,简单说就是请求对于服务端来说都是一视同仁的。这就无法满足实际的开发需求,所以就出现了Cookie和Session,这是HTTP协议无状态所引起的一些问题的补充。

Session简介

Session是存在服务端的,每当客户端请求服务端,服务端就会分配一个内存空间专门存储请求对象的状态等信息,这就是Session,通常我们利用Session存储一些客户端的状态,操作等基本信息,它的底层数据结构一般为线程安全的哈希表(比如Java中的ConcurrentHashMap)。

Session的工作原理与局限

举个例子,客户端A和服务端B,A向B首次请求,当B收到A的请求时,会针对这个请求分配相应的空间存储Session对象,同时产生一个sessionId,然后在响应头中设置Set-Cookie:JSESSIONID=****(上述提到的sessionId),在响应A请求时使A在A的本地设置一条存有SessionId的Cookie信息,同时默认过期时间为A与B的会话结束。然后A再向B请求时,就会在请求头上都带有Cookie信息,然后B通过分析Cookie信息得到sessionId,就可以知道这是A发来的信息,从而可以唯一标识A。
但是这个机制在高可用场景下存在一定的问题,还是刚才的例子,为了保证高可用,我们通常将服务端B多实例化,然后做相应的负载均衡等操作,分为实例B1,B2,B3等。这样就产生SessionId很难在这些实例中共享的问题,从而造成Session的丢失。

Cookie简介

简单来说就是服务端发送到浏览器端的一个数据。用于标识客户端身份。主要应用场景有很多,常见的比如用户操作记录等。

Cookie的工作原理

和上述的Session工作原理关联,客户端接收到服务端的响应时,照Set-Cookie的命令设置相应的Cookie并将其放在每次请求的请求头。
Cookie分为会话Cookie和持久Cookie,前者在浏览器关闭时销毁,不含过期时间,存在内存,后者则含有过期时间存入磁盘,当时间到则不可用。

安全性原理

根据凡是客户端的都是不安全的特性,无论是HTTP还是HTTPS,我们都不应该把敏感信息存入到Cookie中。举个简单的跨站脚本攻击的例子,有些情况下,HttpOnly的属性没有被设置,则有风险会被窃取Cookie。

作用域

所谓作用域就是Cookie能够发送到的链接信息。我们可以在Domain和Path中查看。
在Doamin中设置了域名,则也可以访问子域名。因此在做单点登录SSO的时候,我们通常要注意的是设置Cookie时应该将Cookie存储到第一级域名下。不然会造成跨域问题(基于浏览器同源策略,具体自行搜索了解一下)。
至于Path的话,只是形式变了,变成了路径的显示,和上面同理,设置了Path的目录,则该目录下的子目录都可以访问。

Cookie被禁用的场景

多做一个处理,在Cookie无法被设置的场景下,可以将SessionId写入URL中。从URL中获取SessionId。

JWT(JSON Web Token)与上述CookieSession的异同

相同之处

都是为了对用户做的一个状态存储和身份验证的机制。

不同之处

先要介绍一下JWT,通过JWT的全称字面意思理解就是Json格式的令牌。它之间存储的信息是经过数字签名的(因此具有密码学保证,具有可信任性)。可以根据使用的需求切换不同的密码算法进行签名。
那么与Cookie、Session机制的不同是什么呢?主要是JWT除了认证功能外,还有存储信息的功能,因为上述提到的安全特性,它可以安全的传输信息,因此可以将一些基本信息存储进去并且不必担心篡改的问题。(数字签名的一个特性就是防抵赖,防篡改)
还有对跨域认证的支持,JWT能够通过多个节点进行跨域认证,作跨域处理的成本更低。

JWT的构成

简单来说主要是三部分,Header、Payload、Signature拼接在一起。下面分别介绍

Header

通常情况下是两部分,alg属性和typ属性构成,其中alg顾名思义就是所采用的密码算法,常见的有SHA256,RSA等经典签名算法。而typ属性则主要是指定类型,默认为JWT。

Payload

主要是对客户端身份或是所需数据的声明。其中声明分为三种,registered、public、private的三种类型。
registered声明主要包含签发人,过期时间,主题,可发送方,生效时间与签发时间的部分。
public声明则字面意思理解可以随意添加信息,但是一般不添加敏感信息,因为public处的信息不安全,可以在客户端解密。
private声明则属于自定义声明,用于各方共享信息。

signature

英文理解一下就知道是签名信息,主要由三部分构成,header,payload,secret。
熟悉密码学基础的应该知道主要用于验证JWT的身份,防止篡改。这部分主要用于签名。

如何选择

SSO单点登录场景下推荐JWT,还有某些提供服务的业务场景下,由于很多第三方的api接入与提供,使用JWT既可以方便的解决跨域,还可以做白名单黑名单的校验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值