Cookie和Token是如何工作的
我正在设计一个网页应用,现在在做用户认证功能。我了解到有两种方法:使用 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 个回答
简单来说,基于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