type=class
superclass=Object
included=
extended=
dynamically_included=
dynamically_extended=
library=openssl
aliases=
aliasof=

SSL/TLS セッションを表すクラスです。

セッションとは、SSL/TLS のハンドシェイクで確立される
仮想的なオブジェクトであり、安全な通信路を
実現するために必要な、クライアント側とサーバ側で共有される
情報の集合体です。SSL/TLS ハンドシェイクで必要な計算(特に署名の検証)
はかなり高コストであり、以前にそのような計算を済ませたという事実を
利用してハンドシェイクの高速化を図ることができます。
これがセッションの再利用です。

より具体的には、以下のような手順で再利用が行われます。
  * まずは普通にクライアントとサーバでハンドシェイクを行う
  * クライアントとサーバの両側でハンドシェイクによって共有された
    情報をキャッシュしておく
  * 再びクライアントから SSL/TLS のハンドシェイク開始を要求する
    このときにクライアントはキャッシュしておいた
    セッションのセッション ID を渡す
  * サーバ側は渡されたセッション ID に対応するセッションキャッシュ
    を自身が保持しているキャッシュ領域から探しだす
  * 以降のハンドシェイクは双方でキャッシュされた情報を利用して鍵合意
    などを行い、コネクションを確立する

セッションキャッシュが利用されるかどうかは
ハンドシェークで決まった SSL/TLS 暗号スイートに
依存します。

=== クライアント側のセッションキャッシュ
クライアント側では OpenSSL はキャッシュの保持、管理のための
機能を提供していません。コネクション確立後に
[[m:OpenSSL::SSL::SSLSocket#session]] でセッションを取り出し、
次の [[m:OpenSSL::SSL::SSLSocket#connect]] によるハンドシェイク
前に [[m:OpenSSL::SSL::SSLSocket#session=]] で再利用するセッションを
設定してやることでセッションを再利用します。



=== サーバ側のセッションキャッシュ
サーバ側では [[c:OpenSSL::SSL::SSLContext]] により
セッションキャッシュの保持および管理が行われます。

[[m:OpenSSL::SSL::SSLContext#session_cache_mode=]] で
キャッシュの挙動を設定します。
デフォルトで [[m:OpenSSL::SSL::SSLContext::SESSION_CACHE_SERVER]]
フラグが立っているため、サーバ側のセッションキャッシュ機構は
デフォルトで有効になっています。

セッションキャッシュ機構が有効化されている場合、
SSL/TLS ハンドシェイク終了時に [[c:OpenSSL::SSL::SSLContext]] 内の
キャッシュ保持領域にキャッシュが保持されます。
クライアント側からセッション再利用要求に対しては
キャッシュ保持領域の探索および外部キャッシュへの問合せ
を行い、再利用するセッションを特定します。
キャッシュ保持領域の探索はライブラリが自動的にしますが、
外部キャッシュの探索はアプリケーションプログラマに
よって実装する必要があります
([[m:OpenSSL::SSL::SSLContext#session_get_cb=]] で設定した
コールバックで対応するセッションを返します)。

これらの挙動は
[[m:OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_STORE]] や
[[m:OpenSSL::SSL::SSLContext::SESSION_CACHE_NO_INTERNAL_LOOKUP]] を
[[m:OpenSSL::SSL::SSLContext#session_cache_mode=]]に渡すことで
変更できます。
