Tripletail::Session - セッション

# NAME

Tripletail::Session - セッション

# SYNOPSIS

## PCブラウザ向け

      $TL->startCgi(
          -DB      => 'DB',
          -Session => 'Session',
          -main    => \&main,
      );

      sub main {
          my $session = $TL->getSession('Session');

          my $oldValue = $session->getValue;

          $session->setValue(12345);

          ...
      }

## 携帯ブラウザ向け

      $TL->setInputFilter('Tripletail::InputFilter::MobileHTML');
      $TL->startCgi(
          -DB      => 'DB',
          -Session => 'Session',
          -main    => \&main,
      );

      sub main {
          $TL->setContentFilter(
              'Tripletail::Filter::MobileHTML',
              charset => 'Shift_JIS',
          );
          my $session = $TL->getSession('Session');

          my $oldValue = $session->getValue;

          $session->setValue(12345);

          ...
      }

# DESCRIPTION

64bit符号無し整数値の管理機能を持ったセッション管理クラス。

セッションは64bit整数から負の数を除いた範囲（0..9223372036854775807）以外の データを取り扱えない為、その他のデータを管理したい場合は、 セッションキーを用い別途管理する必要がある。

セッションの管理は DB を利用して行われる。

また、保存に利用するテーブルは自動的に作成される。 デフォルトでは `tl_session_Session` という名前になる。 (Ini 項目 "sessiontable" 参照)

プログラム本体とDB接続を共有するため、以下の点に注意しなければならない。

- セッションの操作は、トランザクション中及びテーブルロック中には行わない。

- コンテンツの出力操作は、トランザクション中及びテーブルロック中には行わない。

セッションキーは、 出力フィルタ に Tripletail::Filter::HTML を使用している場合は クッキー に、 Tripletail::Filter::MobileHTML の場合は クエリ に、それぞれ挿入される。

また、 入力フィルタ に Tripletail::InputFilter::HTML を使用している場合は クッキー から、Tripletail::InputFilter::MobileHTML の場合は クエリ から、それぞれ読み取られる。

出力フィルタに Tripletail::Filter::HTML を利用した場合は、 入力フィルタに Tripletail::InputFilter::HTML を使用する必要がある。

同様に、出力フィルタに Tripletail::Filter::MobileHTML を利用した場合は、 入力フィルタに Tripletail::InputFilter::MobileHTML を使用する必要がある。

出力フィルタに Tripletail::Filter::MobileHTML を利用する場合は フォームの利用の仕方に注意が必要であるため、 Tripletail::Filter::MobileHTML ドキュメントに書かれている 利用方法を別途確認すること。

## METHODS

`$TL->getSession`

        $session = $TL->getSession($group)

  Tripletail::Session オブジェクトを取得。 引数には ini で設定したグループ名を渡す。省略可能。

  このメソッドは、 Tripletail#startCgi の呼び出し時に `-Session => '(Iniグループ名)'` で指定されたグループのセッションが有効化 されていなければ `die` する。

  引数省略時は 'Session' グループが使用される。

`isHttps`

        $session->isHttps

  現在のリクエストがhttpsなら1を、そうでなければundefを返す。

        if ($session->isHttps) {
            ...
        }

`get`

        $sid = $session->get

  ユニークなセッションキーを取得する。セッションが存在しなければ、新規に発行する。

  バックエンドが RDBMS の場合には、セッションキーは 64bit 整数値の負の数を除いた範囲となる。 Perlでは通常 32bit 整数値までしか扱えないため、セッションキーを数値として扱ってはならない。

  バックエンドが MongoDB の場合には、セッションキーは `ObjectId` (https://docs.mongodb.com/manual/reference/method/ObjectId/) の 16 進表現となる。次のように MongoDB::OID のコンストラクタに渡す事で OID オブジェクトを作る事ができる:

        my $sid = MongoDB::OID->new($session->get);

  セッションの発行は常に行え、double モード時の非SSL側からの get メソッド呼び出しでもセッションは設定される。 ただし、SSL側からアクセスした際にセッションが無効になるため、その時にセッションIDは再作成される。

  このメソッドの呼び出しは、コンテンツデータを返す前に行わなければならない。

`renew`

        $sid = $session->renew

  新しくユニークなセッションキーを発行し、取得する。

  以前のセッションキーが存在した場合、そのセッションキーは無効となる。 また、以前のセッションに保存されていた値も破棄される。

  このメソッドの呼び出しは、コンテンツデータを返す前に行わなければならない。

`discard`

        $session->discard

  現在のセッションキーを無効にする。 また、セッションに保存されていた値も破棄される。

  このメソッドの呼び出しは、コンテンツデータを返す前に行わなければならない。

`setValue`

        $session->setValue($value)

  セッションに値を設定する。

  バックエンドが RDBMS の場合には、設定できる値は 64bit 符号無し整数のみである（※PostgreSQL利用時は64bit整数値のみ）。

  バックエンドが MongoDB の場合には、設定できる値は `ObjectId` (https://docs.mongodb.com/manual/reference/method/ObjectId/) の 16 進表現のみである。

  その他のデータを管理したい場合は、セッションキーを用いて別途実装する必要がある。

  doubleモードの場合は、SSL起動時の場合に限り、両方のセッションに書き込まれる。 doubleモードで非SSL側からこのメソッドを使ってセッションを書換えようとした場合、 httpsモードで非SSL側から書き換えようとした場合は `die` する。

  このメソッドの呼び出しは、コンテンツデータを返す前に行わなければならない。

`getValue`

        $value = $session->getValue

  セッションから値を取得する。

  セッションが存在しない場合は undef を返す。

`getSessionInfo`

        ($name, $sid, $checkval) = $session->getSessionInfo

  セッション情報を取得する。

  クッキーやフォームにセッションを保存する際の名称、セッションキー、チェック値を返す。 チェック値は、現在のリクエストが https/http によって使用されているものが返される。 そのため、double モードの場合、現在のリクエスト状態に応じてチェック値が異なる。

  セッションが存在しない場合は $sid、$checkval には undef が返る。

## 古いセッションデータの削除

TripletaiL は、古いセッションデータを削除することはしません。

パフォーマンスを維持するため、古いセッションデータを定期的に削除するバッチを作成し、定期的に 実行するようにして下さい。

削除は以下のようなクエリで行えます。

     DELETE FROM tablename WHERE updatetime < now() - INTERVAL 7 DAY LIMIT 10000

セッションの保存期間にあわせて、WHERE条件を変更して下さい。

また、セッションテーブルがMyISAM形式の場合は、LIMIT句を付けて一度に削除する レコード件数を制限し、長時間ロックがかからないようにすることを推奨します。

DELETE結果の件数が0件になるまで、ループして処理して下さい。

セッションテーブルがInnoDB形式の場合も、トランザクションが大きくなりすぎないよう、 LIMIT句を利用することを推奨します。

### MongoDB の場合

MongoDB の場合には、各セッションデータの最終更新日時はドキュメントの `u` フィールドに `date` 型で格納されます。

### TripletaiL 0.29 以前のセッションテーブルの注意

TripletaiL 0.29 以前では、セッションテーブルを作成する際に、 updatetime カラムにインデックスを張っていませんでした。

レコードの件数が多い場合、古いデータの削除に時間がかかることがあります。 その場合は、updatetime カラムにインデックスを張るようにして下さい。

0.30以降では、セッションテーブル作成時にインデックスを張るように動作が変更されています。

     ALTER TABLE tablename ADD INDEX (updatetime);
     CREATE INDEX tablename_updtime_idx ON tablename (updatetime);

## Ini パラメータ

mode

        mode = double

  設定可能な値は、'http'、 'https'、 'double'のいずれか。省略可能。

  デフォルトはdouble。

  httpモード

    SSLでの保護がないセッションを利用する。http/httpsの両方で使用できるが、セッションキーはhttp側から漏洩する可能性があるため、https領域からアクセスした場合も、十分な安全性は確保できないことに注意する必要がある。

  httpsモード

    SSLでの保護があるセッションを利用する。セッションキーはhttp側からの漏洩を防ぐため、http通信上には出力されない。https側でのみセッションへのアクセスが可能。

  doubleモード

    http側とhttps側で二重にセッションを張る。 https側からのみセッションへの書き込み・破棄が行え、その際にhttp側のセッション情報も同時に書き換えられる。 http側からはhttps側からセットされたセッション情報の参照のみが出来る。

    http側はセッションキー漏洩の危険性があり、十分な安全性は確保できないが、https側は十分な安全性が確保できる。http側からセッションキーが漏洩した場合でも、https領域でのアクセスは安全である。

                        http領域読込    http領域書込    https領域読込   http領域書込
          httpモード    ○              ○              ○              ○
          httpsモード   die             die             ○              ○
          doubleモード  ○              die             ○              ○

cookie

        cookie = Cookie

  http領域で使用するクッキーのグループ名を指定する。省略可能。

  デフォルトは'Cookie'。

securecookie

  https 領域で使用するクッキーのグループ名を指定する。省略可能。 secureフラグが付いていなければエラーとなる。

  デフォルトは'SecureCookie'．

timeout

        timeout = 30 min

  指定の時間経過したセッションは無効とする。度量衡 参照。省略可能。 最短で timeout - updateinterval の時間でタイムアウトする可能性がある。

  デフォルトは30min。

updateinterval

        updateinterval = 10 min

  最終更新時刻から指定時間以上経過していたら、DBの更新時刻を更新する。度量衡 参照。省略可能。 最短で timeout - updateinterval の時間でタイムアウトする可能性がある。

  デフォルトは10min。

setvaluewithrenew

        setvaluewithrenew = 1

  setValueした際に自動的にrenewを行うか否か。 0の場合、行わない。 1の場合、行う。

  デフォルトは1。

dbgroup

        dbgroup = DB

  使用するDBのグループ名。 ini で設定したグループ名を渡す。 Tripletail#startCgi で有効化しなければならない:

        # RDBMS をバックエンドにする場合の例
        $TL->startCgi(
            -DB      => 'DB',
            -Session => 'Session',
            -main    => \&main,
        );

        # MongoDB をバックエンドにする場合の例
        $TL->startCgi(
            -MongoDB => 'MongoDB',
            -Session => 'Session',
            -main    => \&main,
        );

dbset

        dbset = W_Trans

  使用する書き込み用DBセット名。 Tripletail#startCgi で有効化しなければならない。 ini で設定したグループ名を渡す。

  この項目は RDBMS をバックエンドにする場合にのみ使用される。

readdbset

        readdbset = R_Trans

  使用する読み込み用DBセット名。 Tripletail#startCgi で有効化しなければならない。 ini で設定したグループ名を渡す。

  省略された場合は dbset と同じものが使用される。

  この項目は RDBMS をバックエンドにする場合にのみ使用される。

sessiontable

        sessiontable = tl_session

  セッションで使用するテーブル名。 デフォルトは tl_session_グループ名 が使用される。

  この項目は RDBMS をバックエンドにする場合にのみ使用される。MongoDB の場合には "session_ns" を設定しなければならない。

session_ns

        session_ns = tl.session

  MongoDB をバックエンドにする際にセッションで使用する名前空間。 `DB名.コレクション名` の形式で指定する。 この項目は MongoDB を用いる場合には省略不可能である。

mysqlsessiontabletype

        mysqlsessiontabletype = InnoDB

  MySQLの場合、セッションで使用するテーブルの種類を何にするかを指定する。 デフォルトは指定無し。

  セッションの管理情報が重要である場合、例えばアフィリエイトの追跡に 利用していて、セッションが意図せず途切れるとユーザに金銭的被害が 生じるような場合は、InnoDB を利用することを推奨します。

  それ以外の場合は、MyISAM を利用することを推奨します。 TripletaiL のセッションテーブルは Fixed 型となるため、 非常に高速にアクセスできます。

csrfkey

        csrfkey = JLapCbI4XW7G8oEi

  addSessionCheck及びhaveSessionCheckで使用するキー。 サイト毎に値を変更する必要性がある。

logging

        logging = 1

  セッション管理のログを出力するかを指定する。 1 を指定するとセッション管理情報をログに出力する。0 なら出力しない。 デフォルトは 0。

# SEE ALSO

Tripletail
Tripletail::Cookie
Tripletail::DB
Tripletail::Filter::HTML
Tripletail::Filter::MobileHTML
Tripletail::InputFilter::HTML
Tripletail::InputFilter::MobileHTML

# AUTHOR INFORMATION

Copyright 2006 YMIRLINK Inc.

This framework is free software; you can redistribute it and/or modify it under the same terms as Perl itself

このフレームワークはフリーソフトウェアです。あなたは Perl と同じライセンスの 元で再配布及び変更を行うことが出来ます。

Address bug reports and comments to: tl@tripletail.jp

HP : http://tripletail.jp/

Tripletail::Session - セッション

# INDEX

- $TL->getSession
- AUTHOR INFORMATION
- DESCRIPTION
- Ini パラメータ
- METHODS
- MongoDB の場合
- NAME
- PCブラウザ向け
- SEE ALSO
- SYNOPSIS
- TripletaiL 0.29 以前のセッションテーブルの注意
- Tripletail
- Tripletail::Cookie
- Tripletail::DB
- Tripletail::Filter::HTML
- Tripletail::Filter::MobileHTML
- Tripletail::InputFilter::HTML
- Tripletail::InputFilter::MobileHTML
- cookie
- csrfkey
- dbgroup
- dbset
- discard
- doubleモード
- get
- getSessionInfo
- getValue
- httpsモード
- httpモード
- isHttps
- logging
- mode
- mysqlsessiontabletype
- readdbset
- renew
- securecookie
- session_ns
- sessiontable
- setValue
- setvaluewithrenew
- timeout
- updateinterval
- 古いセッションデータの削除
- 携帯ブラウザ向け

Tripletail::Session - セッション