首先我先分别介绍一下Cookie和Session:
Cookie采用的是客户端的会话状态的一种存储机制。他是服务器在本地浏览器上存储的一个很小的KEY-VALUE数据或者是内存上的,并且在下次访问服务器发送请求的时候,一同发送至服务器的。
Session是一种服务端的信息管理机制,它通过吧这些文件信息以文件的形式存放在服务器的硬盘空间上。
请求过程:但浏览器或者客户端发出请求的时候,要求服务端会产生一个session,这时服务端会先检查一下客户端中的Cookie是否包含session_id或者Session的加密信息,并且判断是否过期。那么这个时候如果发现存在没有过期的session_id,那么服务端会根据session_id检索存储在服务端本地的信息,然后供用户访问。如果不存在,那么将重新生成一个Session。
那么两者最明显的区别就是两者的存储位置不同,前者为客户端浏览器上的,后者为存储在服务器上的。两者同是为了确认用户的身份信息的,但是Cookie机制是通过检查用户的账户密码之类的确认身份信息,而Session是通过检查服务器上的session表来匹配确认用户的身份信息。
对于面试题:
Session将产生的session_id放在Cookie里面,如果用户把Cookie所禁用了,那么是不是Session的功能也无法使用了?
先回答,禁用了Cookie功能,Session功能还是可以正常使用的,只是我们可以通过其他方式来传递session_id,例如通过类似get请求方式一样,将session_id附加到URL地址的后面进行传输,或者通过Post请求方式。从而一样可以让服务端和客户端进行状态确认。
在开发中,session是公认的比Cookie安全。为什么?
第一点,先说下为什么Cookie不安全:一:在我过去的面试经历中,有一位技术经理告诉过我,他可以通过将Cookie的文件拷贝到另一台计算机,另一个客户端上进行对相同网站的登录,可以这样欺骗服务端,实现登录。是的,这就是由于Cookie是存储在客户端浏览器上的,导致用户可以直接进行操作,导致了安全性的降低。
真正的Cookie是存储在客户端的硬盘上的一个文本文件,如果两者的安全性一样,那么就可以不使用Session,这样就可以减轻服务器的负载了。
通过Cookie来获取session_id,得有两个条件:必须要有人首次进行登录之后,或者重启session才会有。第二个条件就是session_id必须是要有效的,所以必须保证session_id是最后一次登录所生成的,session在生命周期以内,且解密已经加密的session_id在短时间很难受实现。。
对于使得Session失效的方法有多种:1.重启tomcat,2.session生命周期结束(可以手动配置),3.可以调用session.invalidate();方法进行回收。