一、Openresty操作cookie的两种方式
1、直接获取cookie
(1)cookie获取
完整cookie: ngx.var.http_cookie, 完整cookie的字符串,如果不存在则返回nil
特定cookie: ngx.var.cookie_username, 获取单个cookie,_后面的cookie的name,如果不存在则返回nil
(2)cookie属性设置
ngx.header['Set-Cookie'] = 'cookie=test; path=/; Expires=' .. ngx.cookie_time(ngx.time() + 60 * 30)
2、通过lua-resty-cookie插件获取
(1)cookie获取
local cookie = resty_cookie:new()
-- 获取所有cookie,是一个table,如果不存在则返回nil
local all_cookie = cookie:get_all()
print(cjson.encode(all_cookie))
--获取特定cookie的值,如果不存在则返回nil
print(cookie:get('cookie'))
(2)cookie属性设置
cookie:set({
key = "cookie",
value = "test",
path = "/",
domain = "localhost",
expires = ngx.cookie_time(ngx.time() + 60 * 13)
})
二、cookie的属性
Name: Cookie名
Value: Cookie值
Domain: Cookie的域。如果设成.test.com,那么子域名a.test.com和b.test.com,都可以使用.test.com的Cookie。
Path: Cookie的路径。如果设成/path/,则只有路径为/path/的页面可以访问该Cookie。如果设为/,则本域名下的所有页面都可以访问该Cookie。
Expires / Max-Age:Cookie的超时时间。若设置其值为一个时间,那么当到达此时间后,此Cookie失效。不设置的话默认值是Session,意思是Cookie会和Session一起失效。当浏览器关闭(不是浏览器标签页,而是整个浏览器)后,此Cookie失效。
Size: Cookie大小。
HttpOnly: 若此属性为true,则只有在http请求头中会带有此Cookie的信息,而不能通过document.cookie来访问此Cookie。
Secure: 设置是否只能通过https来传递此条Cookie。
SameSite:用来防止 CSRF 攻击和用户追踪。可以设置三个值:Strict、Lax 和 None。
Strict: Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。换言之,只有当前网页的 URL 与请求目标一致,才会带上 Cookie。
Lax: Lax规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。
None: 关闭SameSite属性,提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。
Priority: 优先级。定义了三种优先级,Low/Medium/High,当Cookie数量超出时,低优先级的Cookie会被优先清除。
三、curl模拟带cookie的http请求
在curl命令中增加-b "" 实现发送http请求时携带cookie,例如:
curl -v "http://127.0.0.1/rtmplive/live.slice" -b "test=tjh" -H "Host: pull.p2ptest.com" -o /dev/null
这样就携带了cookie名为test,值为tjh的cookie信息