cookie session token总结

发展史

  • 背景
    HTTP协议是无状态的协议。这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。

    为了使某个域名下的所有网页能够共享某些数据,session和cookie出现了。

一、cookie

1.cookie简介

cookie是存在客户端的一小段信息,用来记录用户状态。

  1. 客户端请求服务器,
  2. 服务器响应,需要记录该用户状态,就使用response发送一个响应到客户端,这个响应头,其中就包含Set-Cookie头部。如下
  3. 浏览器保存cookie,发起的第二次请求时,浏览器会自动在请求头中添加cookie
  4. 服务器检查该Cookie,以此来辨认用户状态

响应头:

	Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

2.cookie特点

2.1 由浏览器来管理

如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。

不同的浏览器采用不同的方式保存Cookie。

IE浏览器会在“C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie。

2.2 不可跨域名

根据Cookie规范,浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全

2.3 中文需要编码

中文属于Unicode字符,英文属于ASCII字符
Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码

2.4 可保存二进制图片

需要使用BASE64编码

并不实用。由于浏览器每次请求服务器都会携带Cookie,因此Cookie内容不宜过多,否则影响速度。Cookie的内容应该少而精。

2.5 读取cookie

浏览器提交Cookie时只会提交name与value属性。其他属性如maxAge属性只被浏览器用来判断Cookie是否过期

3. cookie常用属性

Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。

通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookiecookie)向客户端设置Cookie
在这里插入图片描述

3.1 maxAge 有效期

-1(默认值):

  • 临时性Cookie,不会被持久化,不会被写到Cookie文件中
  • 仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效

0: 删除该Cookie
Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果

正数:

  • Cookie会在maxAge秒之后自动失效
  • 浏览器会持久化,即写到对应的Cookie文件中
3.2 secure 安全属性

secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。

二、session

1.session简介

Session是服务器端使用的一种记录客户端状态的机制

2.session生命周期

2.1 在用户第一次访问服务器的时候自动创建,一般把Session放在内存里
2.2 只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session
2.3 服务器会把长时间内没有活跃的Session从内存删除

3.常用属性

Session对应的类为javax.servlet.http.HttpSession类

3.1 maxInactiveInterval 超时时间
  • setMaxInactiveInterval(int seconds)修改超时时间
  • Tomcat中Session的默认超时时间为20分钟
修改web.xml改变Session的默认超时时间。例如修改为60分钟:

<session-config>

   <session-timeout>60</session-timeout>      <!-- 单位:分钟 -->

</session-config>

4.需要浏览器客户端的支持

4.1 cookie中存储JSESSIONID

HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

4.2 默认maxAge属性一般为–1

该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效

5. 浏览器不支持时,URL地址重写

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。

5.1 实现

HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中如:

response.encodeURL("index.jsp?c=1&wd=Java") 

如果是重定向的
 response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));

重新后

<ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    1&wd=Java">

对于WAP程序,

5.2 注意
  • WAP程序
    由于大部分的手机浏览器都不支持Cookie,WAP程序都会采用URL地址重写来跟踪用户会话。

  • tomcat

TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

5.3 Session中禁止使用Cookie

既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。Java Web规范支持通过配置的方式禁用Cookie

方式一:修改web项目中的配置

META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建)
打开context.xml(如果没有则创建),编辑内容如下:

<?xml version='1.0' encoding='UTF-8'?>

<Context path="/sessionWeb"cookies="false">

</Context>
方式二: 修改tomcat中的配置

conf/context.xml

<!-- The contents of this file will be loaded for eachweb application -->

<Context cookies="false">

    <!-- ... 中间代码略 -->

</Context>

注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写。也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie。

三、token

3.1 token简介

token 也称作令牌,由uid+time+sign[+固定参数]

  • uid: 用户唯一身份标识
  • time: 当前时间的时间戳
  • sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
  • 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库

四、cookie session token问题及解决方案

4.1 cookie

  • 浏览器对单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
  • 有的客户端不支持cookie,需要手动设置,比如小程序
  • 浏览器对cookie有限制,不能手动设置cookie,对于混合嵌套的开发有问题,比如小程序跳转H5页面,不能携带cookie
  • CSRF(跨站请求伪造)攻击,这个也好解决,很多框架都屏蔽这个问题

4.2 session

  • 过多的session存在服务器中,对服务器造成压力
  • 不能完全达到负载均衡效果

负载均衡多服务器的情况,不好确认当前用户是否登录,因为多服务器不共享seesion。这个问题也可以将session存在一个服务器中来解决,但是就不能完全达到负载均衡的效果。

4.3 token

可以放在header、url中,在每次网络访问都携带,一般是写请求头header中。

token相比于cookie就是有cookie的功能,没有cookie的限制。比如其他客户端不会限制header的cookie。token是cookie很好替代品。

总结

1、Cookie:保存在客户端,不是很安全;
2、Session:保存在服务器端,并生成一个Session id保存在客户端。访问过多时会占用服务器的内存和性能;
3、Token:首次登陆后,服务器生成Token值,保存在数据库中,再将这个Token值返回给客户端,存储在cookie中。增加数据库的存储和查询压力;
4、JWT(Json Web Token):前后端分离项目中使用。服务端根据算法生成,将返回的结果保存在客户端的localStorage或sessionStorage,客户端每次请求时将JWT放入HTTP Header中的Authorization位(解决XSS和XSRF问题)。消耗服务器的计算压力。

参考链接

  • https://blog.csdn.net/fangaoxin/article/details/6952954
  • https://www.cnblogs.com/linyuhong/p/9968056.html

猜你喜欢

转载自blog.csdn.net/dabaoting/article/details/114130793