Sessionは簡単な感じがするようですが、実際の応用では細部がたくさんあります.本文は現在流行しているnode.jsを例に簡単な紹介をする.


Cookie
Webアプリケーションでは、複数のリクエスト間で「ユーザセッション」を共有する必要があります.しかしHTTP 1.0プロトコルは無状態である.その時Cookieが現れた.クッキーはどうやって処理したの?
Cookieの処理:
サービス側がクライアントにCookieクライアントを送信するブラウザは、Cookieを保存し、要求されるたびにブラウザがHTMLドキュメントが送信される前に、WebサーバがHTTPヘッダのSet-Cookieメッセージを送信することによって、次の例のように、Cookieをユーザの閲覧器に送信する.
Set-Cookie: name=value; Path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT;

重要な属性:
  • name=value:キー値ペア、保存するKey/Valueを設定できます.ここでのnameは他の属性項目の名前と同じではありません.
  • Expires:有効期限(秒)が設定されている時点で、expires=Wednesday、09-Nov-99 23:12:40 GMT
  • などのCookieが無効になります.
  • maxAge:最大失効時間(ミリ秒)、設定後の失効時間
  • secure:secure値がtrueの場合、cookieはHTTPでは無効であり、HTTPSでは
  • しか有効ではない.
  • Path:path=/のようなクッキーが影響する道を表す.パスが一致しない場合、ブラウザはこのCookie
  • を送信しません.
  • httpOnly:マイクロソフトがCOOKIEに拡張したものです.COOKIEに「httpOnly」属性が設定されている場合、プログラム(JSスクリプト、applet等)によりCOOKIE情報が読み取れず、XSS攻撃発生
  • を防止する.
    Nodejsのクッキー
    Nodejsはどのようにクライアントにクッキーを送信したいのですか?2つのシナリオがあります.
    response.writeHeadを使用します.コードは次のとおりです.
    //          
    var today = new Date();
    var time = today.getTime() + 60*1000;
    var time2 = new Date(time);
    var timeObj = time2.toGMTString();
    response.writeHead({
       'Set-Cookie':'myCookie="type=ninja", "language=javascript";path="/";
       Expires='+timeObj+';httpOnly=true'
    });
    

    欠点:response.writeHeadを使用すると、ヘッダは1回しか送信できません.すなわち、1回のみ呼び出され、response.renderと共存できません.そうしないと、エラーが表示されます.
    response.cookieを使用します.コードの例は次のとおりです.
    response.cookie('haha', 'name1=value1&name2=value2', {
    maxAge:10*1000, path:'/', httpOnly:true
    });
    

    構文:response.cookie('cookieName','name=value[name=value...],[options]);
    optionsの各フィールドの意味は上記で説明したが,ここでは繰り返さない.
    クッキーの簡単な使用
    expressは4.xバージョン以降、sessionやcookiesを管理する多くのモジュールがexpressに直接含まれるのではなく、`個別にダウンロードしてインストールする必要があります.
    CookieParserのインストール:
    $ npm install cookie-parser
    

    使用方法:
    var express      = require('express');
    var cookieParser = require('cookie-parser');
     
    var app = express();
    app.use(cookieParser());
     
    app.get('/', function (req, res) {
        //    session    isVisit       
        //          ,    session    isVisit   ,      1。
        if (req.cookie.isVisit) {
            req.cookie.isVisit++;
            res.send('

    ' + req.cookie.isVisit + '

    '); } else { req.cookie.isVisit = 1; res.send(" "); console.log("Cookies: ", req.cookies); // cookie } }); app.listen(80);

    セッションとは?
    sessionは、Cookieがクライアントブラウザに保存され、sessionがサーバに保存されるのとは異なり、クライアントのステータスを記録するメカニズムです.
    クライアントブラウザがサーバにアクセスするとき、サーバはクライアント情報を何らかの形でサーバに記録する.これがsessionである.クライアントブラウザが再アクセスする場合は、セッションからクライアントのステータスを検索するだけでよい.
    Cookieメカニズムがお客様の「パスポート」をチェックしてお客様のアイデンティティを特定する場合、sessionメカニズムはサーバの「お客様明細書」をチェックしてお客様のアイデンティティを確認します.
    sessionはプログラムがサーバ上に構築した顧客ファイルに相当し、顧客が訪問するときは顧客ファイルテーブルを照会するだけでよい.
    両者の違い:
  • cookieデータはクライアントのブラウザに格納され、sessionデータはサーバに格納されます.
  • cookieは安全ではありません.他の人はローカルに保存されているCOOKIEを分析し、COOKIE詐欺を行うことができます.安全を考慮してsessionを使用する必要があります.
  • セッションは、一定時間サーバに保存されます.アクセスが多くなると、あなたのサーバーの性能を占有します.サーバーの性能を軽減することを考慮して、COOKIEを使うべきです.
  • 単一クッキーで保存されているデータは4 Kを超えてはいけません.多くのブラウザでは、1つのサイトに最大20個のクッキーを保存することを制限しています.

  • したがって、登録情報などの重要な情報をセッション、その他の情報として保存する必要がある場合は、クッキーに置くことをお勧めします.
    sessionの簡単な応用
    cookieと同様に、$sudo npm install express-sessionの主な方法はsession(options)であり、optionsにはオプションパラメータが含まれています.主に:
  • name:クッキーを設定し、セッションのフィールド名を保存します.デフォルトはconnect.sidです.
  • store:sessionの格納方式は、デフォルトではメモリに格納されますが、redis、mongodbなどを使用することもできます.expressエコには対応するモジュールのサポートがあります.
  • secret:設定されたsecret文字列によってhash値を計算しcookieに配置し、生成されたsignedCookieの改ざん防止を行う.
  • cookie:session idを格納するcookieに関するオプションを設定します.デフォルトは(default:{path:'/',httpOnly:true,secure:false,maxAge:null})
  • です.
  • genid:新しいセッションを生成idの場合、使用する関数は、uid 2というnpmパッケージがデフォルトで使用されます.
  • rolling:各リクエストに対してクッキーを再設定し、デフォルトはfalseです.
  • resave:セッションが変更されていない場合でも、セッション値は保存され、デフォルトはtrueです.

  • 例:
    var express = require('express');
    var session = resuire('session');
    var app = exoress();
     
    app.user(session({
        secret: 'hubwiz app', //secret           
        cookie: {maxAge: 60 * 1000 * 30} //     (  )
    }));
    app.get('/', function (req, res) {
        if (req.session.sign) {//          
            console.log(req.session);//  session  
            res.send('welecome ' + req.session.name + ',        ');
        } else {//    index  
            req.session.sign = true;
            req.session.name = '   ';
            res.end('    !');
        }
    });
    app.listen(80);