検索
ホームページウェブフロントエンドjsチュートリアルExpress でセッション メソッドと Cookie メソッドを使用する方法 (詳細なチュートリアル)

この記事では、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 番目のパラメーター オプションには次のオプションのパラメーターが含まれます:

  1. path: Cookie の影響を指定します。 to

  2. expires: 時刻形式を指定します。

  3. maxAge: Cookie がいつ期限切れになるかを指定します。

  4. secure: secure 値が true の場合、それは HTTPS でのみ有効です。それ以外の場合、Cookie は HTTPS でのみ有効です。 HTTP 。

  5. httpOnly: ブラウザでは、スクリプトが document.cookie を操作して Cookie を変更することはできません。 true に設定すると、signedCookie と呼ばれるものによる攻撃を回避できます。

signedCookies

実装コードは次のとおりです:

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 の最初のパラメータでサーバーが提供する暗号化キーを指定できることがわかり、署名された設定を使用できることがわかります。オプションの項目を使用して暗号化を実現します。これは比較的安全ですが、クライアントがリクエストを送信すると、リクエスト ヘッダーのデータ量が増加し、さらにデータ共有ができなくなります。

session

express-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 です。

    store: セッションの保存方法、デフォルトは保存されます。
  1. genid: 新しい session_id を生成するとき、デフォルトで npm パッケージ uid2 が使用されます。
  2. ローリング: デフォルトは false です。
  3. resave: セッションが変更されていない場合でも、セッションは保存されます。値、デフォルトは true です
  4. saveUninitialized: 初期化されていないセッションを強制的にデータベースに保存します
  5. secret: ハッシュ値を計算します。秘密の文字列を設定し、それを Cookie に配置して、生成された signedCookie を改ざん防止します
  6. cookie: sessionid を保存する Cookie に関連するオプションを設定します
  7. それでは、それを使用して何ができるでしょうか?以下、一つずつご紹介していきます。
  8. Cookieセッション

Cookieセッションは、構成アイテムのCookie構成アイテムを使用してセッションデータをCookieに保存するという点でsignedCookiesと似ています。データは暗号化されていますが、暗号化されたリクエストによって取得されたデータ構造が異なります。

cooke セッションの構造は次のとおりです:

var session = require('express-session');
var se = session(options);
signedCookie 構造は次のとおりです:
Session {
 cookie:
  { path: '/',
   _expires: 2018-01-29T17:58:49.950Z,
   originalMaxAge: 60000,
   httpOnly: true },
 isFirst: 1 }

Cookie セッションを実装するコードは次のとおりです:

{ 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信息,下次客户端再次发出请求浏览就无法确定用户的身份。

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在ES6中详细解读let和闭包

在vue+iview+less+echarts中实战项目(详细教程)

详细解说vue编码风格

以上がExpress でセッション メソッドと Cookie メソッドを使用する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

Python vs. JavaScript:開発環境とツールPython vs. JavaScript:開発環境とツールApr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール