首先,HTTP超文本传输协议是一种无状态的协议。也就是说,一次请求完成之后服务端和浏览器端之间的联系就被切断了。
那很多时候我们需要记住浏览器的状态,比如这个记住用户的登录信息、区分用户、记录用户浏览内容等,需要下次此用户再来访问我们网站时我们可以给此用户对应的内容。就要想办法跟浏览器端产生联系。
比如我们iOS常使用Webview加载网页。
浏览器端与服务器互相记住状态的方式有两种,一个是Cookie,一个是Session。(简单的还可以用直接拼接参数到URL中的方式)
Cookie
Cookie - 一些键值对的集合(类似字典)。一般被自动存储在打开网页的浏览器端,被保存到硬盘中,浏览器通过域名区分和存储cookie(所以Cookie没有跨域的能力)。浏览器请求一个域名时会去先去找该域名下对应的Cookie,如果有,则自动放进请求连接的请求头中。服务器端可拿到cookie并解析出来对应的数据,判断用户信息。
Cookie保存的键值对的值可以在服务端程序中自定义,比如保存用户的名称等信息;也可以设置Cookie的过期时间。当然,浏览器端也可以自己去组装Cookie与服务端进行交互。
优点:因为数据存储在浏览器方,所以基本不会给服务端造成压力。
缺点:Cookie容易被人拦截并解析出来,模拟请求,所以Cookie一般是不太安全的,尽量避免放置敏感信息;而且Cookie的存储容量是有限制的,一些浏览器还会设置每个域名下对应Cookie的数量。(单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。)
Session
Session - 与Cookie相反,Session把用户信息保存在服务端。但一般Session没法单独使用,因为必须通过Cookie或者直接拼接到URL中的方式确定客户端的身份,来查找对应服务器数据库中的session信息。比如在cookie中存入sessionid来确定用户身份。
优点:Session因为存放在服务端,所以可存储数据量很大。因为敏感信息不通过Cookie传输,中间人无法直接解析,所以它比Cookie安全。
缺点:因为每次请求都需要服务端根据信息去查寻Session信息,所以在请求量很大的情况下,会给服务器造成很大压力。
所以,需要综合考虑安全和性能,把Session和Cookie结合起来使用。
网友评论