cookie && session (nodejs下)

本文最后更新于:2022年2月19日 晚上

cookie

最近用nodejs写一个资讯的后台用到了cookie和session,这里做下总结吧。

一、常见流程

  • 客户端访问服务器,服务端响应时附带上cookie
  • 浏览器将cookie保存到本地
  • 之后访问服务器,浏览器会将cookie发送到服务器端(可以设置是否发送,详见path属性)

二、参数选项

  • Path: cookie影响的路径,默认为’/‘(即访问所有路径都会发送cookie)。自定义设置后,访问路径不匹配时则不会发送这个cookie
  • Expires:cookie的过期时间。未设置时,则cookie会在关闭浏览器时丢失。
  • maxAge :cookie的有效时长(以毫秒为单位)。
  • HttpOnly:设置后,cookie值在document.cookie将不可见,浏览器端将无法通过脚本document.cookie去更改cookie。
  • Domain:设置cookie的作用域
  • Secure:设为true时,cookie将只在https连接中传递,无法在在http中传递。

session

模块用的是express-session
https://www.npmjs.com/package/express-session#cookiesamesite

一、简单流程:

  • 客户端首次访问某网站
  • 服务器生成cookie并初始化session,将session ID保存到cookie中,
  • 响应时把包含sessionID的cookie发送给客户端,客户端保存cookie到本地
  • 客户端再次访问时则会发送包含sessionID的cookie,服务器端就可以根据cookie里的sessionID来做相应的操作了(这取决于项目本身)

二、参数选项:

  • cookie:详见上文
  • secret:用来注册session ID到cookie中,相当于一个密钥
  • genid:设置创建session ID的自定义函数(默认使用”uid-safe”的库生成id)
    1
    2
    3
    4
    5
    6
    genid: function(){
    return genuuid() // 生成uuid作为session id
    }
    genid: function(){
    return 'genid_test' // 注意返回的id最好是不重复的,我这里只是随便返回一个值做测试
    }
    1,2为genuuid()生成,3则为我自己的测试
  • name: 可以理解为sessionID保存在cookie中的键值的名称,该值在响应时设置, 之后可以在浏览器发送请求时在requset中读取。默认值为’connect.sid’
    如设置

    name='session-id'

    genid='genid_test'

    那么客户端的cookie中将会有

    session-id:包含sessionID的字符串

在这里插入图片描述

  • resave:强制session保存到session store,即便没有发生变化。通常来说,建议设置为false(详见)。
  • rolling:每次请求时强制设置cookie,这将重置cookie的过期时间(maxAge)。(ps:设置为true,而saveUninitialized设置为false时,那么未初始化的session中的cookie请求时将不会刷新重置时间。)
  • saveUninitialized:强制保存未初始化的session。默认为true。(ps:如果把这个值设置为true但是saveUnitialized设置为false,那么cookie不会被包含在响应中(没有初始化的session))
  • store: session存储的实例子,一般可以用redis和mongodb来实现

session初始化:当用户第一次访问网站的时候,由于Cookies中没有这个合法的SessionID存在,所以服务器会初始化用户的会话,随机分配一个SessionID给他,并写入到用户的Cookies里面。这个SessionID关联的Session就代表了用户的会话信息,这个过程就是初始化会话。

三、登陆验证的配置

对于一个网站,如果要求必须登陆才能访问的话,可以考虑对session使用如下配置

1
2
3
4
5
6
7
8
9
10
11
session({
cookie: { // 根据项目需求配置吧

},
resave: false,
rolling: true, // 每次访问都刷新cookie
saveUninitialized: false // 不保存未初始化的session
store:new sessionStore({
url: config.db.url // 把session存放在数据库,这里用了connect-mongo模块
})
})

resave通常情况下设置false就行了(避免浏览器多个请求同时发送时发生竞争)。一般来说,对于已经登陆的用户,我们会对其session添加一些属性来表示用户处于登陆状态,比如登陆成功时设置req.session.user='login'。而rolling和saveUninitialized分别为true和false的搭配,可以做到

  • 未登录用户的session不会保存到数据库(未对session进行操作,没有初始化);访问登陆界面时服务器也不会发送cookie给客户端。
  • 已登陆用户的session添加登陆状态(初始化)后,将保存在数据库中,并且发送一个携带sessionID的cookie给客户端。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!