【问题标题】:CORS vs JWT what is differenceCORS 与 JWT 有什么区别
【发布时间】:2020-11-12 02:02:39
【问题描述】:
我在 heroku 上开发和部署了 django rest api。然后我试图在 vue cli 中获取 api,但它不起作用。它说 CORS 错误。这次我的脑海里有一些问题
- 我应该在后端使用 cors 库或 allor-origin 在前端启用 cors??
- 我可以使用 JWT 代替 CORS
- 如果在后端启用 cors 应该面临什么问题??
【问题讨论】:
标签:
django
postgresql
vue.js
django-rest-framework
【解决方案1】:
CORS 和 JWT 完全不同。
JWT 代表 JSON Web Tokens,是 RFC 7519 定义的基于令牌的身份验证。因此,JWT 令牌用于允许访问(登录)Web 资源。您还可以向令牌添加信息(如用户名),如果未加密,则可以公开读取。但是 JWT 有一种签名方法,因此可以验证令牌是否有效。可以使用不同的加密算法,例如RSA。您可以选择非对称签名(例如 RSA)或对称签名(例如 HS256)。
您可以在jwt.io找到有关 JWT 的信息
CORS 代表 Cross-Origin Resource Sharing,它定义了如何允许浏览器跨资源请求请求,或者换句话说:对其他域的 HTTP 访问。
在我看来,Mozilla 很好地覆盖了 CORS:
https://developer.mozilla.org/de/docs/Web/HTTP/CORS
针对您的具体问题:
您正在尝试访问不属于同一域的资源(http 链接),因此出于安全原因,您的浏览器不允许打开它。
allow-origin 是一个 HTTP 标头,在您使用的网络框架中设置。
由于 Django 没有开箱即用的 CORS,因此您需要添加一些内容,例如 https://github.com/ottoyiu/django-cors-headers
安装后,您可以启用 CORS
CORS_ORIGIN_ALLOW_ALL = True
并启用您要调用的跨域请求:
CORS_ORIGIN_WHITELIST = (
'host1.example.com',
'host2.example.com',
'host3.foobar.info'
)
【解决方案2】:
两者都不一样
CORS(Cross-Origin Resource Sharing) 实现了客户端浏览器和具有不同来源的服务器之间的资源共享,这允许停止或允许从客户端到服务器的请求。
JWT 是一种为您的应用程序添加安全性的方法,您可以使用 JWT 来识别用户,这样,服务器只会向拥有有效 JWT 的用户发送响应,请阅读更多信息here
-
答案1:必须在后端启用CORS,在前端你可以使用axios来执行http请求,它会添加所需的headers
-
答案 2:如果不启用 CORS,来自客户端(世界各地访问您的网站/应用程序的人)的请求将被拒绝,因此您的应用程序只能在主机上使用,无论如何,JWT 不会添加任何内容在这种情况下,JWT 用于识别有效用户,即有权访问服务器资源的用户。
启用 CORS 并在没有 JWT 的情况下接受请求,意味着您的应用程序/网站不使用身份验证系统,也不需要验证用户身份。还有其他识别用户的方法,JWT 只是其中之一。
-
答案 3:为了避免恶意请求,必须添加一个安全层,这样只有允许的用户才能访问服务器资源。