cookie、session与token

前言

由于http协议的无状态性,导致服务器收到客户端请求后得到的都是全新的请求,不知道历史记录,为了解决这个问题,便引入了cookie和session来弥补这个不足。

关于session

客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是Session对象。服务器可以利用Session存储客户端在同一个会话期间的一些操作记录。

而session的工作原理就是:服务器第一次接受到请求后开辟一块空间,同时生成一个sessionId,然后通过响应头设置cookie,这个cookie会持续到会话的结束。

但是session空间只能开辟在一个服务器中,如果该服务器负载导致转发到另一个服务器访问,session空间将失效。

关于cookie

我们的自定义个性化、购物车、记住密码、用户登录保持等等功能的实现,都运用到了cookie。cookie是服务器发送到web浏览器的一小块数据,浏览器会对其进行储存,并与下一个请求一起发送至服务器。

cookie是如何被创建的呢?这就要引用头文件中的Set-Cookie与Cookie标头了。客户端发送http请求被服务器接收,这时服务器可以发送有Set-Cookie的响应头,这个响应头将cookie从服务器发送到用户代理。这样,随着对服务器的每个新请求,浏览器将使用Cookie头把所有之前储存的Cookie发回服务器。

Cookie一般被分为两种类型:会话cookie(Session Cookie)与永久性Cookie(Persistent Cookie):

  • 会话Cookie:这种类型的cookie在客户端关闭后便会自动删除,此后永远丢失。这种类型的cookie是不会写入磁盘中的,不过有些web浏览器可能会使用会话进行还原。
  • 永久性Cookie:这种类型的cookie会通过指定ExpiresMax-Age指令指定一个过期时间,当到达过期时间后再进行删除。这类的cookie会保存进入磁盘当中。

关于JSON Web Token(JWT)

我们知道由于http的无状态性,在网页访问多个页面时,登录信息是不会被保存的,这时用Session Cookie将登录状态保存在内存中,在之后判断数据与读取的SessionId是否相同,以实现登录状态保持。

不过还有一种认证的方式,就是JWT。不同于Session Cookie,JWT储存的信息是经过数字签名的,因此它的安全性是高于Session Cookie的。一般将JWT用来进行认证与信息传输。当用户登录,后面每个请求都会包含JWT,从而允许用户访问该令牌所允许的路由、服务和资源。

JWT的组成格式

JWT的组成分为三个部分:Header.Payload.Signature

  • Header:JWT的标记头,包括令牌类型与签名算法,通过Base64Url编码。
  • Payload:包含一个声明,分为registered(预定义声明)、public(公共声明)与private(自定义声明)三类,通过Base64Url编码。
  • Signature:签证信息,包括base64编码后的Header与payload,以及secret。签名用于验证消息是否被更改,如果是私钥签名的JWT还可以验证发送者身份。

总结

认识理解了session、cookie与token之后,我们接下来学习xss、CSRF、SSRF等漏洞可以更加顺利,同时可以加深我们对网页原理的理解。