一、区别
cookie
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
cookie是实际存在的http协议中定义在header中的字段。一般来说,登录网站保存的账号密码,保存的都是cookie。
Session
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中。
session是抽象的概念。session是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP(java服务器页面)中关闭它。
Session删除的时间是:
1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
2)程序调用HttpSession.invalidate()
3)服务器关闭或服务停止
二、联系
session 只是逻辑概念,表示一次会话,会话过程是从访问网站开始到关闭浏览器的过程。这个Session是保存在服务端,有一个唯一标识。服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,因为只有这个标识才能知道是那个用户在操作。
如何识别?
使用cookie——每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID(在图报文头的最后一行中的JSESSIONID中),session 的运行依赖 session id。以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
三、token与cookie&session的区别
cookie&session
cookie 登录是有状态的,服务端维护一个 session 客户端维护一个 cookie,cookie 只保留 sessionID 服务端要保存并跟踪所有活动的 session 如下:
- 输入用户名密码登陆。
- 服务器拿到身份并验证后生成一个 session 存到数据库。
- 把 sessionID 返回给客户端存成一个 cookie 保存 sessionID。
- 随后的请求会携带这个包含 sessionID 的 cookie。
- 服务器拿着 sessionID 找到对应的 session 认证用户是否有对应权限啊。
-
登出后,服务端销毁 session 客户端销毁 cookie。
token
token 的认证方式是无状态的,服务端不保存登陆状态,也不关心哪些客户端签发了 token ,每个请求都会携带 token 通常在 header 中,也可以出现在 body 和 query 如下
- 输入用户名密码登陆。
- 服务器拿到身份并验证后签发一个 token。
- 客户端拿到 token 并存起来,好多地方都可以存。
- 客户端发送的每一个请求都要携带 token,好多方式可以携带。
- 服务器接收请求后拿到 token 并解析,拿解析的结果进行权限认证(token中可能已经携带权限信息,能被正常解析的 token 被认为是合法机构签发的)。
-
登出后,在客户端销毁 token 即可。