ChatGPT解决这个技术问题 Extra ChatGPT

Cookie 与会话

几个月前我开始使用 PHP。为了为我的网站创建登录系统,我阅读了 cookie 和会话及其差异(cookie 存储在用户的浏览器和服务器上的会话)。那时,我更喜欢 cookie(谁不喜欢 cookie?!),只是说:“谁在乎呢?我没有任何好的协议将它存储在我的服务器中”,所以,我继续使用 cookie我的本科毕业设计。但是,在完成我的应用程序的大部分之后,我听说对于存储用户 ID 的特殊情况,会话更合适。所以我开始思考,如果陪审团问我为什么使用 cookie 而不是会话,我会说什么?我有这个原因(我不需要在内部存储有关用户的信息)。这足以作为一个理由吗?还是不止于此?您能告诉我使用 cookie 保存用户 ID 的优点/缺点吗?

感谢 StackOverflow 中的所有人!

这两种方法都存储数据。 Cookies 在客户端执行,即在访问者设备的存储中。会话是一个聪明的“扩展”,因为它们只在客户端存储一个唯一的 ID,而在服务器端存储所有实际数据。当他们从客户端的 cookie 中接收到唯一 ID 时,他们就知道要在服务器上加载哪些数据。在大多数情况下,会话将是您所需要的。顺便说一句,您可以使用 github.com/delight-im/PHP-Cookie 以更现代的方式管理两者。
顺便说一句,WordPress 核心几年前放弃了使用会话,现在使用 solely cookies。有趣的。我想知道他们是否这样做是为了更容易在一组负载平衡的服务器上进行部署和/或减少由于会话垃圾收集而导致的随机注销。

F
Fosco

这个概念是为 Web 访问者跨页面加载存储持久数据。 Cookies 将其直接存储在客户端上。会话使用 cookie 作为排序键,与存储在服务器端的数据相关联。

最好使用会话,因为实际值对客户端是隐藏的,并且您可以控制数据何时过期并变为无效。如果这一切都基于 cookie,则用户(或黑客)可以操纵他们的 cookie 数据,然后向您的站点发出请求。

编辑:除了简单之外,我认为使用 cookie 没有任何优势。这样看……用户有什么理由知道他们的ID#吗?通常我会说不,用户不需要这些信息。提供信息应限制在需要知道的基础上。如果用户将他的 cookie 更改为具有不同的 ID,您的应用程序将如何响应?这是一个安全风险。

在会议风靡一时之前,我基本上有自己的实现。我在客户端上存储了一个唯一的 cookie 值,并将我的持久数据与该 cookie 值一起存储在数据库中。然后在页面请求中,我匹配了这些值并拥有我的持久数据,而不让客户控制那是什么。


@JiminyCricket 我不认为这是真的......如果是这样,没有人会使用会话变量来存储当前登录的用户——每个人都会这样做。这将是一个巨大的安全风险。可以肯定的是,会话 ID 通常作为 cookie 存储在客户端计算机上,然后在服务器端与会话数据匹配。服务器通常不通过 IP 地址控制会话,而是通过 cookie 值。
我最近才再次开始只使用 cookie,纯粹是因为如果当前从同一个会话中执行另一个会话,则会话不会加载页面,除非您在需要时为每个页面添加 session_write_close();。滚动您自己的唯一 ID 并与普通 cookie 匹配并没有那么困难,并使所有页面保持美观和活泼。
您认为我应该使用会话进行身份验证吗?它有任何安全风险吗?如果黑客试图更改他的 session-id,服务器将如何响应(假设猜测的 session-id 是有效的)?
使用会话,然后使用 2FA 作为会话可以被劫持。
当然,需要对 cookie 集进行签名以进行授权,这样您就会知道它是否已被更改,如果是,则拒绝它。会话与 cookie 无关。 cookie 是一种 cookie,一种在用户设备上存储数据的方式。会话可以是简单的也可以是复杂的,有数据库或内存存储,也可以没有。大多数框架都有一个会话中间件——要授权用户,你可以设置用户 ID(最好是 uuid 等),只要它是签名的就可以了。如果您实际上是在对会话进行某些操作,而不仅仅是在每个请求上授权用户,您将使用会话 ID 和表。
P
Peyman Majidi

区分这两者的基本思想。

会议:

UID存储在服务器(即服务器端)更安全(因为1)过期不能设置,用户关闭浏览器时会话变量会过期。 (现在它在 php 中默认存储 24 分钟)

饼干:

UID 存储在网络浏览器(即客户端)上 不是很安全,因为黑客可以访问并获取您的信息(因为 1)可以设置过期时间(请参阅 setcookies() 了解更多信息)

当您需要存储短期信息/值时,首选会话,例如用于计算、测量、查询等的变量。

当您需要存储长期信息/值时首选 Cookies,例如用户的帐户(这样即使他们关闭计算机 2 天,他们的帐户仍然会登录)。我想不出很多关于 cookie 的例子,因为它在大多数情况下都没有被采用。


请注意:这不是一个好的答案。它开始时还不错,但会混淆事物并以虚假信息结束。这不是会话与 cookie 的解释。这是会话与会话+会话 cookie 的解释。出于上述原因,单独使用 Cookie 并不受欢迎。出于所述原因,首选会话+会话 cookie。
另一个错误是您确实通过 PHP 配置影响了会话生命周期。
Sessions 仍然在用户浏览器上设置了一个 cookie,所以这个服务器-客户端的解释是不准确的
任何应用程序都可以轻松设置会话到期。第三点是错误的。另外,您忘记了可以存储在 cookie 与会话中的数据量。这是更重要的一点
IDU 代表什么?
t
thumbtackthief
SESSIONS ENDS WHEN USER CLOSES THEIR BROWSER,

COOKIES END DEPENDING ON THE LIFETIME YOU SET FOR IT. SO THEY CAN LAST FOR YEARS

这是您选择的主要区别,

如果你想让 id 被长时间记住,那么你需要使用 cookie;否则,如果您只想让网站识别此访问的用户,那么会话就是要走的路。

会话存储在您的 php 服务器将生成的文件中。为了记住哪个文件是给哪个用户的,php 还将在用户的浏览器上设置一个 cookie 来保存这个会话文件 id,以便在他们下次访问时 php 将读取这个文件并重新加载会话。

现在 php 默认每隔一段时间清除会话,并且会话的命名约定使其自动过期。此外,一旦浏览器关闭或历史记录被清除,浏览器将不会保留保存会话 ID 的 cookie。

需要注意的是,现在的浏览器还支持另一种存储引擎,例如 LocalStorage、SessionStorage 和其他 webdb 引擎,javascript 代码可以使用这些引擎将数据保存到您的计算机以记住您。例如,如果您在 Facebook 中打开 javascript 控制台并输入“localStorage”,您将看到 Facebook 使用的所有变量来记住您,而无需使用 cookie。


实际上,默认情况下会话持续到用户关闭浏览器,但是可以通过将 session.cookie_lifetime = 0 中的 0 更改为您希望会话持续的秒数或通过使用 session_set_cookie_params()。
更多有用的信息,这样的问题得到了很多答案..太好了,再次感谢 DOK!
另请记住,会话文件可以创建单点故障。当通过代理、ip 切换器或僵尸发生最小的 dos 样式攻击时,会在您的服务器硬盘或 ssd 上创建一个会话文件。如果您无法跟上读写速度,您的网站将会关闭。
任何人都可以clafiry:“当用户关闭他的浏览器时会话结束” 1.如果用户从页面导航awya怎么办......然后在不关闭浏览器的情况下返回。 2. 如果他们打开了多个指向同一个站点的浏览器窗口/选项卡怎么办?在这种情况下,一些工作中的网络应用程序会感到困惑,但我不知道他们使用什么类型的 cookie。
@jcansell 好,cookie 不会被多个选项卡或导航混淆,在这种情况下,这些 web 应用程序很可能使用本地存储/会话存储来使用 javascript 保存数据
F
Fifi

简短的回答

按优先级排序的规则:

规则 1. 永远不要相信用户输入:cookies 不安全。对敏感数据使用会话。

规则 2. 如果用户关闭浏览器时必须保留持久性数据,请使用 cookie。

规则 3. 如果用户关闭浏览器时不需要保留持久性数据,请使用会话。

规则 4. 阅读详细答案!

来源:https://www.lucidar.me/en/web-dev/sessions-or-cookies/

详细解答

饼干

Cookie 存储在客户端(在访问者的浏览器中)。

Cookie 不安全:读取和写入 cookie 内容非常容易。

使用 cookie 时,您必须根据欧洲法律 (GDPR) 通知访问者。

可以设置过期时间,但用户或浏览器可以更改它。

用户(或浏览器)可以(设置为)拒绝使用 cookie。

会话

会话存储在服务器端。

会话使用 cookie(见下文)。

会话比 cookie 更安全,但并非无懈可击。

过期在服务器配置中设置(例如 php.ini)。

默认过期时间为 24 分钟或浏览器关闭时。

用户刷新或加载新页面时会重置过期时间。

用户(或浏览器)可以(设置为)拒绝使用 cookie,因此拒绝会话。

从法律上讲,您还必须通知访问者获取 cookie,但尚不清楚缺乏先例。

合适的选择

会话使用 cookie!会话数据存储在服务器端,但 UID 存储在客户端的 cookie 中。它允许服务器将给定的用户与正确的会话数据相匹配。 UID 受到保护且难以破解,但并非无懈可击。对于敏感操作(更改电子邮件或重置密码),不要依赖会话和 cookie:要求用户密码以确认操作。

敏感数据绝不应存储在 cookie 中(电子邮件、加密密码、个人数据......)。请记住,数据存储在外国计算机上,如果计算机不是私人计算机(教室或公共计算机),其他人可能会读取 cookie 内容。

记住我的数据必须存储在 cookie 中,否则当用户关闭浏览器时数据将丢失。但是,不要在“记住我”cookie 中保存密码或用户个人数据。将用户数据存储在数据库中,并将此数据与存储在 cookie 中的一对加密的 ID / 密钥链接起来。

在考虑了前面的建议之后,以下问题最终可以帮助您在 cookie 和会话之间进行选择:

用户关闭浏览器时必须保留持久数据吗?

如果答案是肯定的,请使用 cookie。

如果答案是否定的,请使用会话。


谢谢有帮助。
w
whoan

当您将 #ID 保存为 cookie 以识别登录用户时,您实际上是在向与他们无关的用户显示数据。此外,如果第三方试图在他们的浏览器中将随机 ID 设置为 cookie 数据,他们将能够让服务器相信他们是用户,而实际上他们不是。那是缺乏安全感。

您使用了 cookie,并且正如您所说,您已经完成了大部分项目。此外 cookie 具有保留很长时间的特权,而会话结束得更快。所以会话在这种情况下不适合。实际上,许多著名和流行的网站和服务都使用 cookie,您可以长时间保持登录状态。但是您如何使用他们的方法来创建更安全的登录过程呢?

这里的想法是:你可以帮助你使用 cookie 的方式:如果你使用随机密钥而不是 ID 来识别登录用户,首先,你不会将你的主要数据泄露给随机用户,其次,如果你考虑随机密钥足够大,任何人都很难猜测密钥或创建随机密钥。例如,您可以在用户的浏览器中保存一个 40 长度的密钥:“KUYTYRFU7987gJHFJ543JHBJHCF5645UYTUYJH54657jguthfn”,任何人都不太可能创建确切的密钥并假装是其他人。


很好的解释。我在令牌中使用 GUID 来识别单个用户。
C
Community

实际上,会话和 cookie 并不总是分开的。通常,但并非总是,会话使用 cookie。

在这些其他问题中,您的问题有一些很好的答案。由于您的问题专门关于保存用户的 IDU(或 ID),我认为这与其他问题并不完全重复,但他们的答案应该对您有所帮助。

cookies vs session

Cache VS Session VS cookies?

What is the difference between a Session and a Cookie?


A
Abel Callejo

TL;博士

标准/因素 会话 Cookie 时期(存在开始) 在 HTTP 响应之前创建 在 HTTP 响应之后创建 在第一个 HTTP 请求期间的可用性 是 否 在后续 HTTP 请求期间的可用性 是 是 最终控制数据和到期 服务器管理员 最终用户 默认过期时间早于 cookie 持续时间长于会话 服务器成本 内存 内存 网络成本 无 不必要的额外字节 浏览器成本 无 内存安全 难以劫持 易于劫持 弃用 无 现在不鼓励使用 JavaScript “Web Storage”

细节

优点和缺点是主观的。它们可能导致二分法(对某些人来说是优势,但对其他人来说是劣势)。相反,我在上面列出了可以帮助您决定选择哪一个的因素。

在第一个 HTTP 请求和响应期间存在

假设您是一个想要同时处理会话和 cookie 的服务器端人员。第一次 HTTP 握手将如下所示:

浏览器准备 HTTP 请求 -- SESSIONS: 不可用; COOKIES:不可用浏览器发送HTTP请求服务器接收HTTP请求服务器处理HTTP请求--SESSIONS:存在; COOKIES: cast 服务器发送 HTTP 响应 浏览器接收 HTTP 响应 浏览器处理 HTTP 响应 -- SESSIONS: 不可用;饼干:存在

在第 1 步中,浏览器不知道会话和 cookie 的内容。在第 4 步中,服务器可以有机会设置会话和 cookie 的值。

后续 HTTP 请求和响应期间的可用性

浏览器准备 HTTP 请求 -- SESSIONS: 不可用; COOKIES:可用浏览器发送HTTP请求服务器接收HTTP请求服务器处理HTTP请求--SESSIONS:可用; COOKIES:可用 服务器发送 HTTP 响应 浏览器接收 HTTP 响应 浏览器处理 HTTP 响应 -- SESSIONS:不可用;饼干:可用

有效载荷

假设您在一个网页中加载由 example.com 托管的 20 个资源,这 20 个资源将携带有关 cookie 的额外字节信息。即使它只是对 CSS 或 JPG 图像的资源请求,它仍然会在到达服务器的途中在其标头中携带 cookie。对 JPG 资源的 HTTP 请求是否应该携带一堆不必要的 cookie?

弃用

会话没有替代品。对于 cookie,there are many other options 在浏览器中存储数据而不是 old school cookies

存储用户数据

Session 存储用户数据更安全,因为它不能被最终用户修改,只能在服务器端设置。 Cookies on the other hand can be hijacked 因为它们只是存储在浏览器中。


M
Muhammad Sanaullah

我个人同时使用 cookie 和会话。

仅当用户单击“记住我”复选框时才使用 Cookie。并且cookies是加密的,数据只在服务器上解密。如果有人试图编辑 cookie,我们的解密器能够检测到它并拒绝该请求。

我见过很多网站将登录信息存储在 cookie 中,任何人都可以简单地更改 cookie 中的用户 ID 和用户名来访问任何帐户。

谢谢,


佚名

会话允许您像使用 cookie 一样存储单个信息,但数据存储在服务器而不是客户端上。


u
user3824494

Session 和 Cookie 是不一样的。

会话用于存储来自网页的信息。通常网页没有任何记忆来存储这些信息。但是使用我们可以保存必要的信息。

但是Cookie是用来识别用户的。使用 cookie 我们可以存储数据。它是存储在用户网络浏览器中的一小部分数据。因此,每当用户下次浏览时,浏览器都会将 cookie 数据信息发送回服务器以获取以前的活动。

学分:Session and Cookie


如果用户禁用 cookie 会怎样? cookie如何识别用户?
W
Wasiq Mahmood WM

我会选择 Session,首先 session 比 cookies 更安全,cookies 是客户端站点数据, session 是服务器站点数据。 Cookies 用于识别用户,因为它是嵌入我的服务器和用户计算机浏览器的一小段代码。另一方面,Session 可以帮助您保护您的身份,因为 Web 服务器不知道您是谁,因为 HTTP 地址将状态 192.168.0.1 更改为 765487cf34ert8ded…..或借助 GET 和 POST 方法的其他数字。 Session 将用户的数据存储在唯一 ID 会话中,即使用户 ID 也无法相互匹配。 Session 将单个用户信息存储在一个应用程序的所有页面中。 Cookies expires 是在 setcookies() 的帮助下设置的,而 session expires 没有设置,它在用户关闭浏览器时过期。


J
Jay-R Joseph Gabunada

Cookie 和会话用于存储信息。 Cookie 仅存储在客户端计算机上,而会话存储在客户端和服务器上。

会议

会话在服务器上的临时目录中创建一个文件,其中存储了已注册的会话变量及其值。在访问期间,该数据将可供网站上的所有页面使用。

会话在用户关闭浏览器或离开站点后结束,服务器将在预定时间后终止会话,通常为 30 分钟。

饼干

Cookie 是存储在客户端计算机上的文本文件,用于跟踪使用情况。服务器脚本向浏览器发送一组 cookie。例如姓名、年龄或身份证号等。浏览器将此信息存储在本地机器上以供将来使用。

当下次浏览器向 Web 服务器发送任何请求时,它会将这些 cookie 信息发送到服务器,服务器使用该信息来识别用户。


M
Md. Jamil Ahsan

Session 和 Cookie 的主要区别在于 Session 数据存储在服务器上,而 Cookie 将数据存储在访问者的浏览器中。

会话比 Cookie 更安全,因为它存储在服务器中。

存储在 Cookie 中的数据可以存储数月或数年,具体取决于 Cookie 的寿命。但是当浏览器关闭时,Session 中的数据会丢失。


K
Kamalakannan J

正如其他人所说,Sessions 很聪明,并且在向客户隐藏信息方面更有优势。

但是 Cookie 至少还有一个优势,您可以通过 Javascript(例如 ngCookies)访问您的 Cookie。使用 PHP 会话,您无法在 PHP 脚本之外的任何地方访问它。


你可以..当然不是直接的,你可以通过一些 ajax 请求访问它来返回会话数据的脚本。但我不确定你应该这样做。
M
Megersa

会话是与 cookie 信息相关联的服务器上的一组信息。如果您使用的是 PHP,您可以检查会话。保存_路径位置并实际“查看会话”。 cookie 是发送给客户端和从客户端返回的数据片段。 Cookies 通常用于促进会话,因为它告诉服务器哪个客户端处理了哪个会话。还有其他方法可以做到这一点(查询字符串魔术等),但 cookie 可能是最常见的。