Cookie和Token是如何工作的

3 投票
2 回答
1422 浏览
提问于 2025-04-18 06:52

我正在设计一个网页应用,现在在做用户认证功能。我了解到有两种方法:使用 cookies 和 tokens。我对这两者的工作原理不是很明白。

如果我选择使用 tokens,我打算用 django-rest-framework-jwt。现在我对这个功能的理解是这样的:

Tokens

用户发送他的登录信息(用户名和密码)。应用程序会验证这些信息是否正确,然后计算出一个 token,并把它发回给用户。当用户发起请求时,他会把这个 token 包含在请求中。应用程序会解码这个请求,从中获取用户的信息。

我有几个问题:

- 我们是怎么得到这个 token 的?它是像计算哈希值那样的吗? - 解码 token 后,我们怎么获取用户的信息? - 怎么判断这个 token 是否失效? - 使用 tokens 的网页应用可以通过浏览器访问吗?

Cookies

使用 cookies 的过程和 tokens 类似,但 cookies 是通过 HTTP 头发送的,而不是放在请求体里。cookies 必须存储在服务器端。

我有几个问题:

- 我在文章中看到说 tokens 有一个有效期的优势,但 cookies 也有这个特点。那么 cookie 和 token 的有效期有什么区别? - 我们怎么识别发起请求的用户?是存一个字典(cookie, 用户 ID)吗?

2 个回答

0

简单来说,基于Cookie的认证(通过在客户端的Cookie中存储会话ID)和令牌认证的区别在于,认证令牌是通过HTTP头中的“authentication”字段发送的。这种方式更灵活,因为有些REST客户端(比如手机上的原生应用)根本不支持Cookie的概念。

会话认证是Django自带的功能,而Django-rest-framework也提供了会话认证的支持。

Django-rest-framework有一种内置的方法可以将令牌传递给客户端,但你也可以自己实现其他方式。

令牌在数据库中被删除之前都是有效的。你也可以在这里自己设计一个自动失效的解决方案。

Django-rest-framework的文档对它支持的不同认证机制有很详细的说明。可以查看 http://www.django-rest-framework.org/api-guide/authentication

0

我觉得你说的“令牌”(Tokens)和“会话”(Sessions)是一样的,就像在这个链接上说的那样。

就像你提到的,会话会计算一个哈希码或者ID,然后把它发回给用户,用来识别用户是否已经登录等。

直接回答你的问题:

  1. 会话和Cookie是一起工作的。一旦Django生成了一个SessionId,它会通过Cookie存储在用户的电脑上,同时也会在Django的后台记录下来。所以,我不太确定你的问题是否成立。你可以看看这个链接了解更多。

  2. 上面的链接也回答了你的问题。简单来说,发回给用户的SessionId包含一个ID,用来识别这个用户是否已经登录,或者其他一些属性等。

撰写回答