使用cookie和session实现登录(简单原理解析)

cookie:浏览器在客户端电脑硬盘中开辟的一块空间,主要用来存储服务端数据(比如sessionId)。
cookie中的数据是以域名的形式进行区分的。
cookie中的数据是有过期时间的超过时间会被浏览器自动删除。
cookie中的数据可以随着请求被发送到服务器端。
使用cookie和session实现登录(简单原理解析)_第1张图片
客户端第一次向服务器端发送请求时是没有cookie的,请求后服务器端会在cookie中存入一些数据。下次在访问相同的服务器就会带上cookie中的数据。

session:实际上是一个对象,存储在服务器端的内存中,在session对象中也可以存储多条数据,每一条数据都有一个sessionid作为唯一标识。
建议:重要数据存session(相对安全),不重要数据存cookie(全存session影响服务器性能)。

利用cookie和session登录的原理:
客户输入账号密码进行登录,服务器端进行验证,验证成功则生成sessionId,并且在session对象中存储当前用户信息。服务器端将sessionId写入客户端cookie中,当客户端下次访问服务器端时cookie会被自动发送给服务器端,服务器端在cookie中拿到sessionId然后在服务器端的session对象中查找sessionId进行验证,验证成功说明用户是登陆状态,则可以为其响应只有在登陆状态才能响应的数据。
使用cookie和session实现登录(简单原理解析)_第2张图片
在node.js中使用session功能需要借助第三方模块:express-session ,这是由express官方提供的一个中间件函数。所以用app.use()拦截所有请求并使用session函数进行处理。方法内部做了哪些事情呢?他会为请求对象下面添加一个属性session ,session属性的值是一个对象,可以在用户登录成功后保存用户信息,方法内部会在我们向session对象存储数据时生成sessionId(当前存储数据的唯一标识),然后将sessionId存储在客户端的cookie中,然后当客户端再次访问服务器端时方法会从客户端发送过来的cookie中拿到sessionId,根据sessionId从服务器端的session对象中找到对应客户信息进行验证,实现登录功能。

const session = require(‘express-session’)
app.use(session({secret:‘secret key’}))//secret的值是可以随便写的,作用是对要存储的cookie信息进行加密,当客户端再次访问服务器端时服务器端可以对拿到的cookie进行解密。这样做的好处是客户端虽然可以查看cookie的信息,但是看到的是一堆加密的字符串,这样可以提高数据的安全性。

将session持久化存储:
①将session存储到mongodb数据库当中:

 	var express = require('express');
    var session = require('express-session');
    var MongoStore = require('connect-mongo')(session);//目前已知唯一用来存储session到数据库的包  
    app.use(session({
        secret: config.cookieSecret, //secret的值建议使用128个随机字符串
        cookie: {maxAge: 60 * 1000 * 60 * 24 * 14}, //过期时间
        resave: true, // 即使 session 没有被修改,也保存 session 值,默认为 true
        saveUninitialized: true,
        store: new mongoStore({
            url:'mongodb://127.0.0.1:27017/xxx'//xxx:数据库名,存储时会自动在xxx生产session集合名
        })
    }))
    app.listen(80);

②将session数据同步到redis中:还需下载redis数据库,见:
https://blog.csdn.net/qq_41812254/article/details/96576794

 	var express = require('express');
    var session = require('express-session');
    var RedisStore = require('connect-redis')(session);

    var app = express();
    var options = {
        "host": "127.0.0.1",
        "port": "6379",
        "ttl": 60 * 60 * 24 * 30,   //session的有效期为30天(秒)
    }
    // 此时req对象还没有session这个属性
    app.use(session({
        store: new RedisStore(options),
        secret: 'express is powerful'
    }))
    app.listen(80);

你可能感兴趣的:(javascript)