引言
Cookie是一个漂亮的设计, 是HTTP协议中的重要组成部分, 用于网站保存传送一些网站的附加信息, 随着技术的发展, localstorage, sessionstorage的出现, cookie用的越来越少, 但是因为Cookie的特点, 登陆信息,SessionKey, private consent 还是主要存在于Cookie里面. 因为最近要写一个权限部分的知识, Cookie是绕不过的, 所以先介绍一些Cookie的基本知识.
基本知识
Cookie是一个Key:Value对, 在每次请求一个网址时, 都会随着请求(Request)传送到后台服务器, 后台服务器根据Cookie的不同, 可以做一些对应的处理, 目前主要用于保存用户的登陆Token, 会话Token等等信息, 也可以包括用户的一些设置, 比如显示偏好, 查询记录等等. Cookie的标准是RFC 2109, 希望了解Cookie的规格可以去查看, 不过一般不需要看了, 本文会提及主要内容.
Cookie的主要属性:
-
Domain
域名(如www.jianshu.com), Cookie是和某一个域名关联的, 在向后台发请求时, 只有对应域名的Cookie会传送过去. 域名包括名字和端口(默认为80). -
Expires
过期时间, 超过某个时间后, Cookie会被浏览器自动清除. -
HttpOnly
是否允许客户端(也就是浏览器Javascript)访问 -
MaxAge
Cookie最长允许保留时间, 这个和Expires
概念不太一样,Expires
是一个固定时间, 到了就会清除.MaxAge
是时间间隔, 从最后一次设置这个cookie算起, 到了这个间隔就会取消. 一般用于登陆信息的自动失效. -
Path
cookie可以设置到具体的路径下, 特别是多租户网站, 可以让各个租户的cookie是不一样的. 比如(/MieMengNiao), 当有这个设置的时候, 只有访问这个路径(及子路径) 才会附加到请求上, 发回到后端. -
SameSite
用来限制第三方 Cookie,从而减少安全风险, 主要有三个选项, None, Lax, Strict. Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。None就是没限制了.
这个设置主要是为了防止CSRF跨域攻击, 阻绝钓鱼网站窃取你的cookie
-
Secure
这个是只有HTTPS时, 才会附加cookie,传送到后台. 为了防止中间人攻击, 现在网站一般都会应用SSL, 用HTTPS传输数据.
Cookie 的限制 在RFC2109中规定, 浏览器对于每个域名至少,要支持20个Cookie及以上, 每个Cookie的大小至少4K以上(cookie的大小,包括Key和Value的长度), 目前主流浏览器支持远多于这个限制, 但是不建议超过RFC规定的最低要求. 另外从实践角度, 也不支持太多, 太大的Cookie, 这个会拖慢网站访问速度, 无必要的消耗带宽和服务器资源.
AspNetCore中的Cookie
AspNetCore对于Cookie支持很好(所有的主流框架对cookie支持都很好, 也都差不多, 这个算是基础设施).
在HttpRequest
/HttpResponse
上都有对应的IRequestCookieCollection
和IResponseCookies
接口, 可以读取写入cookie.
在Microsoft.AspNetCore.Authentication.Cookies
中有一个CookieManager
, 可以对Cookie进行简单的添加,删除等操作, 特别是, 它会自动把超长的cookie(超过4K)分拆成多个Cookie, 保证在任何浏览器上都可以正常工作.
其它
因为Cookie并不安全, 主流的浏览器都可以让用户控制是否关闭掉Cookie的功能, 据我的经验, 好像没有人真的关闭Cookie功能, 因为没有Cookie真的不方便.