cookie与session是常用的会话跟踪技术。cookie在客户端记录信息确认用户身份,session在服务端记录信息确认用户身份。
cookie主要用于网站为了辨别用户身份而存储在用户本地终端上的数据,类型为“小型文本文件”,存储容量较小。浏览器会在特定情况下携带上cookie来发送请求,并通过cookie来获取一些信息。
1、cookie总是保存在客户端,按存储位置可分为内存cookie与硬盘cookie
- 内存cookie由浏览器维护,保存在内存中,浏览器关闭时cookie就会消失。
- 硬盘cookie保存在硬盘中,有一个过期时间,用户手动清理或过期时间到时才会被清理。
- 如何判断cookie是内存cookie还是硬盘cookie?
- 没有设置过期时间,默认情况下cookie是内存cookie,在关闭浏览器时会自动删除。
- 有设置过期时间,并且过期时间大于0的cookie是硬盘cookie,需要手动或到期时才会删除。
- 如何判断cookie是内存cookie还是硬盘cookie?
2、cookie的生命周期:
- 默认情况下的cookie是内存cookie,也称会话cookie,即在浏览器关闭时自动删除。
- 可以通过expires或max-age来设置过期时间:
- expires设置的是Date.toUTCString(),设置的格式expires=date-in-GMTString-format
- max-age设置过期秒钟,max-age=seconds(如一年的时间365*25*60*60),默认是-1
- 如果max-age是负数,则是内存cookie,关闭浏览器即失效
- 如果max-age是0,则表示删除该cookie
- cookie的作用域
- Domain:指定哪些主机可以接受cookie
- 如果不指定,默认是origin,不包括子域名
- 如果指定Domain,则包括子域名。如设置Domain=mozilla.org,则cookie也包括在子域名中(如developer.mozilla.org)
- Path:指定哪些主机下的路径可以接受cookie
- 如设置Path=/users,则以下地址都会匹配:
- /users
- /users/profile
- /users/profile/xxx
- 如设置Path=/users,则以下地址都会匹配:
- Domain:指定哪些主机可以接受cookie
3、设置cookie
可以在客户端或服务端设置,更多的是设置在服务端
- 客户端
// 以javascript为例
// 以键值对的形式进行设置
document.cookie = 'name=xxx';
// 也可加上过期时间
document.cookie = 'name=xxx;max-age=60'
- 服务端:不同后台设置方式不同,以具体后台为准
4、session与cookie的区别
- cookie数据存放在客户端,易被修改,安全性低;而session数据存放在服务端,过期时间、加密格式等都可在服务端进行设置,加入签名后数据便不可被修改,安全性提高;
- 由于session数据保存在服务端,访问的增多带来的也是服务器性能压力的增大,因此如果考虑到减轻服务器压力,cookie的作用便体现出来了。建议用户登录等重要信息存在在session中,非隐私的其他信息可保存至cookie中。
5、cookie与session的缺点
- cookie会被附加在每个http请求中,无形中增加了流量(事实上某些请求是不需要的)
- cookie是明文传递的,可以在headers中进行获取,存在安全性的问题
- cookie的大小限制是4KB,最大存储量较小,不同浏览器允许最大存储cookie个数也不同
- 对于浏览器外的其他客户端(如IOS、Andriod),必须手动的设置cookie和session
- 对于分布式系统和服务器集群中保证每个系统都可正确的解析session较为复杂