session的简述
session和cookie都是用来解决HTTP的连接时无状态的问题。比如我们常见的登录问题,如果没有session和cookie机制我们每次都要输入用户和密码。
cookie是把状态信息保留在客户端,一旦cookie创建,浏览器就会给每次请求添加上cookie的请求头,当cookie的信息比较大时,这无形给每次请求增加了负担。
session是把用户的状态信息保留在服务端,把sessionID发送给客户端并保存在cookie中,这种每次请求的时候,用户只需带着sessionID过来就行了。session无疑增加了服务端的负担,比如要根据sessionID查询session的信息,session的维护(定时清理等)。
Kong的session插件,说几点
- 存储
Kong支持两种session的存储方式cookie和kong。kong的方式是把session的状态存储在Kong的数据库中(pg或者Cassandra);cookie的方式是把信息存储在客户端,这个是在用户第一次访问的时候,会返回一个Set-Cookie的头给客户端。 - 过期时间
Kong的session插件有两个参数config.cookie_lifetime和config.cookie_renew。cookie_renew是说多久重建一次session,如果session重建了,客户端存储的cookie就失效了,服务端会再次返回Set-Cookie请求头。
cookie_lifetime是指session的最终过期时间,这个参数我没理解透,我的理解是:如果我们访问过程中session发生了重建,那么cookie_lifetime就会被重置。后面是官方的解读,如果有更好的理解请告诉我呀,万分感激:
Sessions will use the built-in Kong DAO ttl mechanism which destroys sessions after specified cookie_lifetime unless renewal occurs during normal browser activity.
- cookie跨域
Kong设置了三个参数Strict,Lax, off。每个请求其实是有两个属性起源域名origin和目的域名destination,当origin和destination不一样时就是跨域请求了。
Strict
,当origin和destination不一样时就不会发送该cookie
Lax
, 当origin和destination不一样时,会有一种情况就是origin是其他的域名,destination是本域名(Kong的8000端口所在的域名),这种情况会发送cookie
off
, 不管情况都会发送
做个小实验
- 环境准备
你需要有一个service和route,如果没有的话,参考https://blog.csdn.net/u014686399/article/details/100084613,我的试验也是基于这个 - 启用插件
/services/4abd8249-936a-477d-ac3e-7b21a00aa3f6/plugins POST
{
"name":"session",
"config":{
"storage": "kong",
"cookie_secure": false
}
}
- 4abd8249-936a-477d-ac3e-7b21a00aa3f6 这是服务的id
- storage 使用Kong的存储
- 测试
首次访问
curl -i -X GET --url http://172.16.0.92:31545/xjj_example/main?apikey='U3FffwYrxdvEtNmevAmWMiXpZ3pQiwNv'
- 我添加了key-auth插件所以我的请求要添加apikey,如果你没有添加key-auth插件,就不用添加这个头
- 我们带着cookie来访问
curl -i -X GET \
--url http://172.16.0.92:31545/xjj_tv/main?apikey='U3FffwYrxdvEtNmevAmWMiXpZ3pQiwNv' \
-H "session=G6mKAW9_Hsavn4nXrR60Uw..|1567138877|XKFcMNdtQcn84jw8eIlMg5sLjwE.; Path=/; SameSite=Strict; HttpOnly"
- Kong的session插件的 logout
这个我没研究明白,请各位大神指点一下
先写到这里了,有问题进QQ群630300475