Fork me on GitHub

cookie和session的区别

对于许多人来说,都知道的是,cookie是存储在客户端的,可以用来放需要长期使用的内容,例如用户密码、用户账户等等,服务器是可以获取到cookie的内容的;而session则是存储在服务器端,通过唯一的session_id来区别用户,用于保存用户的登录状态和请求等,客户是不能获取到其内容的。这对于许多人来说都是比较基础的内容,也是表现形式上的区别,在这里我们深入的了解一下两者。

1
2
3
cookie是存在于客户端的由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
cookie的内容主要包括: 名字、值、过期时间、路径和域。其中路径与域一起构成cookie的作用范围,若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。
cookie是服务器端给客户端分发的一种凭证,客户端要请求服务,就需要在发送数据的同时发送cookie,服务器端通过识别cookie的内容,得知用户身份。

要查看cookie可以在控制台输入javascript: alert(document.cookie);就可以看到网站分发的cookie了。

实际上的cookie有两种,分别是停留在浏览器所占内容的
临时性的cookie,在页面窗口关闭之后就被删除,被称为session cookie;而另外一种是通过存放在硬盘空间中长期 存在的cookie,这种cookie被称为persistent cookie,也就是我们通常意义上所讲的cookie。

session

1
2
3
session的出现: 对于cookie是存储在客户端的,这种存储在客户端的信息往往是不安全的,所以后来又有了session,客户端浏览器向服务器发送请求的时候,服务器将客户端的信息以某种形式存储在服务器上,这种存储在服务器端的信息在客户端第二次访问服务器的时候被使用,用来确定用户的状态等信息。
session的使用: 服务器会在客户端第一次请求服务的时候创建session对象,与cookie类似,session对象也是以键值对的形式存储的。每个session 对象都有独立的session_id,对于特定的客户,就赋予特定的session,可以区分不同的用户。需要注意的是,通常是在用户请求具体服务的时候才会创建session,单纯的访问静态的内容(如HTML)并不会创建session。而在创建之后的每一次客户访问服务器都会更新session的内容,比如session的最后访问时间等等。还有一点是session的内容应该尽量的精简,因为session是存储在服务器端的,需要占用到宝贵的服务器资源(一般放在服务器内存里),所以这里在有大量客户访问的时候,会导致服务器的资源不够用。此外还会给session设置有效期,对于长时间没有活跃的session会从内存中删除,这也是我们用一些Web应用时会有说“登录超时”的情况出现。
session的依赖实现: 对于上面所说的session,它对于用户来说是透明的,在客户请求服务的时候,客户端需要有一个标示自己身份的凭证,但是仅仅是标示自己的身份,所以这个标示会比较小。通过这个身份,服务器才能从内存中的多个session中知道用户是对应于哪一个session。一般来说session是要依赖于cookie来实现,这一点在上面讲到cookie的分类时说到,这时候生成的cookie就是上文提到的session cookie,而cookie的内容就是session的特定的id,这个cookie在浏览器关闭的时候就会失效。因此同一个机器上的两个浏览器窗口访问服务器的时候会生成两个不同的session。但是如果两个窗口是由同一个父窗口打开的话,子窗口会共享父窗口的cookie,所以这时候是共享一个session。

如果禁用了cookie,那要怎么实现session

在浏览器禁用cookie或者不支持cookie的时候,通常会采取一种叫做”URL重写”的方式来实现session,也就是以类似于GET方式,将session_id写在URL的后面,这样服务器也能获取到客户的session_id,通过这个独立的id就能识别特定的用户了。

Your support will encourage me to continue to create!