この記事では、Express がどのようにセッションと Cookie を使用するかを主に紹介し、参考として提供します。
ステートレス http
http リクエストとレスポンスは互いに独立しており、サーバーは 2 つの http リクエストが同じユーザーによって送信されたかどうかを識別できないことは誰もが知っています。つまり、サーバーには通信状態を記録する機能がありません。通常、セッション内の両当事者の身元を確認するために Cookie とセッションを使用します。
cookie
cookie は、サーバーからさまざまな識別子を送信し、サーバーは、クライアントによって送信されたこの識別子を通じてユーザーの ID を識別します。その後、ユーザーの関連データがユーザーに送信されます。
express が提供する cookie-parser ミドルウェアをインストールします:
npm i -S cookie-parser
使用するプロジェクト ページ モジュールに cookie-parser プラグインを導入し、次のようにインスタンス化します:
var cookieParser = require('cookie-parser'); var cp = cookieParser(secret, options);
これには 2 つのパラメーターがあり、最初のパラメーターは Secret 、これを使用して Cookie に署名できます。これは、よく Cookie 暗号化と呼ばれるものです。暗号化の原則に精通している学生は、この文字列がサーバーが所有する暗号文であることを知っているはずです。 2 番目のパラメーター オプションには次のオプションのパラメーターが含まれます:
path: Cookie の影響を指定します。 to
expires: 時刻形式を指定します。
maxAge: Cookie がいつ期限切れになるかを指定します。
secure: secure 値が true の場合、それは HTTPS でのみ有効です。それ以外の場合、Cookie は HTTPS でのみ有効です。 HTTP 。
httpOnly: ブラウザでは、スクリプトが document.cookie を操作して Cookie を変更することはできません。 true に設定すると、signedCookie と呼ばれるものによる攻撃を回避できます。
実装コードは次のとおりです:
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // 如果请求中的 cookie 存在 isFirst // 否则,设置 cookie 字段 isFirst, 并设置过期时间为10秒 app.get('/', function(req, res) { if (req.cookies.isFirst) { res.send("再次欢迎访问"); console.log(req.cookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000}); res.send("欢迎第一次访问"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
上記のコードから、cooke-parser の最初のパラメータでサーバーが提供する暗号化キーを指定できることがわかり、署名された設定を使用できることがわかります。オプションの項目を使用して暗号化を実現します。これは比較的安全ですが、クライアントがリクエストを送信すると、リクエスト ヘッダーのデータ量が増加し、さらにデータ共有ができなくなります。
sessionexpress-sessionは、セッションを作成するために使用されるexpressjsのミドルウェアです。サーバーはセッション ID を生成し、クライアントは Cookie を使用してセッション ID の暗号化されたリクエスト情報を保存し、ユーザーがリクエストしたデータをサーバーに保存します。ただし、ユーザーのデータを暗号化して保存することもできます。クライアント側で。
session は、クライアントとサーバー間のセッション ステータスを記録し、クライアントの ID を判断するために使用されます。 express-session はセッションの保存場所をサポートしています
Cookie、メモリ、または redis や mongodb などのサードパーティ サーバーに保存できます。
セッションはデフォルトでメモリに保存されます。Cookie に保存するのは安全性が低く、非 Redis データベースに保存するのはクエリ速度が遅すぎます。一般的なプロジェクト開発では、セッションは Redis (キャッシュ) に保存されます。データベース)。
express が提供する Express-session ミドルウェア インストール コマンドをインストールします:
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser('my_cookie_secret')); // cookie app.get('/', function(req, res) { if (req.signedCookies.isFirst) { res.send("欢迎再一次访问"); console.log(req.signedCookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000, signed: true}); res.send("欢迎第一次访问"); } });
使用するプロジェクト ページ モジュールに Express-session プラグインを導入し、次のようにインスタンス化します:
npm i -S express-session
メイン パラメーター オプションの構成項目session() には次のものがあります:
name: セッションのフィールド名を保存するための Cookie を設定します。デフォルトは connect.sid です。
Cookieセッション
var session = require('express-session'); var se = session(options);
Session { cookie: { path: '/', _expires: 2018-01-29T17:58:49.950Z, originalMaxAge: 60000, httpOnly: true }, isFirst: 1 }
{ isFirst: '1' }
signed-cookie vs cookie session
signedCookies情報は表示されますが変更できません、Cookie セッションは非表示です。これも変更できませんsignedCookie 情報はクライアントに長期間保存され、後者のクライアントは閉じられると情報が消えます
针对Cooke session增加了客户端请求的数据规模,我们一般这样使用,数据库存储session。
数据库保存session
用数据库保存session,我们一般使用redis,因为它是缓存数据库,查询速度相较于非缓存的速度更快。
express-session 的实例代码如下:
var path = require('path'); var express = require('express'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); // route app.get('/', function(req, res) { if (req.session.isFirst) { res.send("欢迎再一次访问。"); console.log(req.session) } else { req.session.isFirst = 1; res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
但有时我们也使用非redis数据库保存session,这时我们就需要对项目结构有深刻的认识和理解;否则,使用后反而会适得其反。
另外,我们要注意使用数据库保存session数据,在浏览器端的session-id会随着浏览器的关闭而消失,下次打开浏览器发送请求时,服务器依然不能识别请求者的身份。
cookie session 虽然能解决这个问题,但是它本身存在着安全风险,其实cookie session 和 signedCookies都面临xss攻击。
其实,使用signedCookies和session的结合会在一定程度上降低这样的风险。
signedCookies(cookies) 和 session的结合
在开发中,我们往往需要signedCookies的长期保存特性,又需要session的不可见不可修改的特性。
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, // cookie: { maxAge: 60 * 1000, httpOnly: true }, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); app.get('/', function(req, res, next) { if(req.session.isFirst || req.cookies.isFirst) { res.send("欢迎再一次访问"); } else { req.session.isFirst = 1; res.cookie('isFirst', 1, { maxAge: 60 * 1000, singed: true}); res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
这样我们将session保存在redis中的信息,保存在了session_id所标示的客户端cooke中一份,这样我们就不用担心,浏览器关闭,cookie中的session_id字段就会消失的情况,因为浏览器中还有它的备份cookie,如果没有备份的cookie信息,下次客户端再次发出请求浏览就无法确定用户的身份。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
在vue+iview+less+echarts中实战项目(详细教程)
以上がExpress でセッション メソッドと Cookie メソッドを使用する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。