Identity Server 3/4

权限控制设计入门---Cookie 简介

2019-11-22  本文已影响0人  灭蒙鸟

引言

Cookie是一个漂亮的设计, 是HTTP协议中的重要组成部分, 用于网站保存传送一些网站的附加信息, 随着技术的发展, localstorage, sessionstorage的出现, cookie用的越来越少, 但是因为Cookie的特点, 登陆信息,SessionKey, private consent 还是主要存在于Cookie里面. 因为最近要写一个权限部分的知识, Cookie是绕不过的, 所以先介绍一些Cookie的基本知识.

基本知识

Cookie是一个Key:Value对, 在每次请求一个网址时, 都会随着请求(Request)传送到后台服务器, 后台服务器根据Cookie的不同, 可以做一些对应的处理, 目前主要用于保存用户的登陆Token, 会话Token等等信息, 也可以包括用户的一些设置, 比如显示偏好, 查询记录等等. Cookie的标准是RFC 2109, 希望了解Cookie的规格可以去查看, 不过一般不需要看了, 本文会提及主要内容.
Cookie的主要属性:

  1. Domain 域名(如www.jianshu.com), Cookie是和某一个域名关联的, 在向后台发请求时, 只有对应域名的Cookie会传送过去. 域名包括名字和端口(默认为80).
  2. Expires 过期时间, 超过某个时间后, Cookie会被浏览器自动清除.
  3. HttpOnly 是否允许客户端(也就是浏览器Javascript)访问
  4. MaxAge Cookie最长允许保留时间, 这个和Expires概念不太一样, Expires是一个固定时间, 到了就会清除. MaxAge是时间间隔, 从最后一次设置这个cookie算起, 到了这个间隔就会取消. 一般用于登陆信息的自动失效.
  5. Path cookie可以设置到具体的路径下, 特别是多租户网站, 可以让各个租户的cookie是不一样的. 比如(/MieMengNiao), 当有这个设置的时候, 只有访问这个路径(及子路径) 才会附加到请求上, 发回到后端.
  6. SameSite 用来限制第三方 Cookie,从而减少安全风险, 主要有三个选项, None, Lax, Strict. Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。None就是没限制了.

这个设置主要是为了防止CSRF跨域攻击, 阻绝钓鱼网站窃取你的cookie

  1. Secure 这个是只有HTTPS时, 才会附加cookie,传送到后台. 为了防止中间人攻击, 现在网站一般都会应用SSL, 用HTTPS传输数据.

Cookie 的限制 在RFC2109中规定, 浏览器对于每个域名至少,要支持20个Cookie及以上, 每个Cookie的大小至少4K以上(cookie的大小,包括Key和Value的长度), 目前主流浏览器支持远多于这个限制, 但是不建议超过RFC规定的最低要求. 另外从实践角度, 也不支持太多, 太大的Cookie, 这个会拖慢网站访问速度, 无必要的消耗带宽和服务器资源.

AspNetCore中的Cookie

AspNetCore对于Cookie支持很好(所有的主流框架对cookie支持都很好, 也都差不多, 这个算是基础设施).
HttpRequest/HttpResponse上都有对应的IRequestCookieCollectionIResponseCookies接口, 可以读取写入cookie.
Microsoft.AspNetCore.Authentication.Cookies中有一个CookieManager, 可以对Cookie进行简单的添加,删除等操作, 特别是, 它会自动把超长的cookie(超过4K)分拆成多个Cookie, 保证在任何浏览器上都可以正常工作.

其它

因为Cookie并不安全, 主流的浏览器都可以让用户控制是否关闭掉Cookie的功能, 据我的经验, 好像没有人真的关闭Cookie功能, 因为没有Cookie真的不方便.

上一篇下一篇

猜你喜欢

热点阅读