I started using PHP a couple of months ago. For the sake of creating a login system for my website, I read about cookies and sessions and their differences (cookies are stored in the user's browser and sessions on the server). At that time, I preferred cookies (and who does not like cookies?!) and just said: "who cares? I don't have any good deal with storing it in my server", so, I went ahead and used cookies for my bachelor graduation project. However, after doin' the big part of my app, I heard that for the particular case of storing user's ID, sessions are more appropriate. So I started thinking about what would I say if the jury asks me why have you used cookies instead of sessions? I have just that reason (that I do not need to store internally information about the user). Is that enough as a reason? or it's more than that?
Could you please tell me about advantages/disadvantages of using cookies for keeping User's ID?
感谢大家在StackOverflow!
博士TL;
Criteria / factors |
Sessions |
Cookies |
Epoch (start of existence) |
Created BEFORE an HTTP response |
Created AFTER an HTTP response |
Availability during the first HTTP request |
YES |
NO |
Availability during the succeeding HTTP requests |
YES |
YES |
Ultimate control for the data and expiration |
Server administrator |
End-user |
Default expiration |
Expires earlier than cookies |
Lasts longer than sessions |
Server costs |
Memory |
Memory |
Network costs |
None |
Unnecessary extra bytes |
Browser costs |
None |
Memory |
Security |
Difficult to hijack |
Easy to hijack |
Deprecation |
None |
Now discouraged in favor of the JavaScript "Web Storage" |
细节
优点和缺点是主观的。它们可能会导致一种两分法(对一些人来说是优势,但对另一些人来说是劣势)。相反,我列出了可以帮助你决定选择哪一个的因素。
第一个HTTP请求-响应期间的存在
假设您是服务器端人员,希望同时处理会话和cookie。第一次HTTP握手是这样的:
浏览器准备HTTP请求——SESSIONS:不可用;COOKIES:不可用
浏览器发送HTTP请求
服务器接收HTTP请求
服务器处理HTTP请求——SESSIONS:已存在;饼干:投
服务器发送HTTP响应
浏览器接收HTTP响应
浏览器处理HTTP响应——SESSIONS:不可用;饼干:存在
在步骤1中,浏览器不知道会话和cookie的内容。
在步骤4中,服务器可以有机会设置会话和cookie的值。
后续HTTP请求-响应期间的可用性
浏览器准备HTTP请求——SESSIONS:不可用;饼干:可用
浏览器发送HTTP请求
服务器接收HTTP请求
服务器处理HTTP请求——SESSIONS:可用;饼干:可用
服务器发送HTTP响应
浏览器接收HTTP响应
浏览器处理HTTP响应——SESSIONS:不可用;饼干:可用
有效载荷
假设在一个网页中,你加载了example.com托管的20个资源,这20个资源将携带关于cookie的额外字节信息。即使它只是一个CSS或JPG图像的资源请求,在通往服务器的途中,它仍然会在它们的头文件中携带cookie。对JPG资源的HTTP请求应该携带一堆不必要的cookie吗?
弃用
会话是不可替代的。对于cookie,在浏览器中存储数据有许多其他选项,而不是老式的cookie。
用户数据的存储
会话对于存储用户数据更安全,因为最终用户不能修改它,只能在服务器端进行设置。另一方面,cookie可能被劫持,因为它们只是存储在浏览器上。
这个概念是跨页面加载为web访问者存储持久数据。cookie直接将其存储在客户机上。会话使用cookie作为某种密钥,与存储在服务器端的数据相关联。
最好使用会话,因为实际值对客户端隐藏,您可以控制数据何时过期并失效。如果它完全基于cookie,用户(或黑客)可以操纵他们的cookie数据,然后向您的站点发送请求。
编辑:我不认为使用cookie有任何好处,除了简单。这样看……用户有任何理由知道他们的ID号吗?通常我会说不需要,用户不需要这些信息。在需要知道的基础上,提供信息应该受到限制。如果用户将cookie更改为不同的ID,应用程序将如何响应?这是一个安全隐患。
在会话盛行之前,我基本上有自己的实现。我在客户机上存储了一个唯一的cookie值,并将我的持久数据与该cookie值一起存储在数据库中。然后在页面请求中,我匹配这些值并获得持久数据,而不让客户端控制这些数据。
cookie和Sessions用于存储信息。cookie只存储在客户端机器上,而会话存储在客户端和服务器上。
会话
会话在服务器上的临时目录中创建一个文件,其中存储了注册的会话变量及其值。在访问期间,网站上的所有页面都可以使用这些数据。
当用户关闭浏览器或离开站点时,会话结束,服务器将在预定的时间(通常为30分钟)后终止会话。
饼干
cookie是存储在客户端计算机上的文本文件,用于跟踪使用目的。服务器脚本向浏览器发送一组cookie。例如姓名、年龄或身份证号等。浏览器将这些信息存储在本地机器上以备将来使用。
当浏览器下次向web服务器发送任何请求时,它将这些cookie信息发送到服务器,服务器使用这些信息来识别用户。