質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1399閲覧

セッションタイムアウト時にタイムアウトとなったセッションidを取得したい

paseri457

総合スコア2

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2023/09/05 23:36

編集2023/09/05 23:57

実現したいこと

laravelにてセッションタイムアウトを判定した段階で、タイムアウトになったsession_idを取得したい。

セッションタイムアウトとなったセッションidを取得し、そのセッションidで登録していたDBのレコードに更新処理をかけたい。

試したこと

handler.phpにてセッションタイムアウトを検知した際に、セッションidを出力するログを記載。
結果として、出力されたログはタイムアウトになったセッションidではなく、新しく生成されたセッションidが取得された。

補足情報(FW/ツールのバージョンなど)

無効なセッションを判定する際に
Illuminate\Auth\GuardHelpers.phpのcheck関数にて、リクエストされたセッションからユーザ情報を取得する処理をもって実施していることは確認済み。

一番不明なのは、無効になっているセッションをブラウザ側がリクエストとして投げないのか、リクエストとしては送信されており、サーバー側で無効なセッションかの判定をしてレスポンスで新しいセッションidを渡して、再度リクエストが来ているのかというところ。
後者であれば、無効なセッションがリクエストされた際にセッションidを取得したい。

laravel 9
細かい設定はいじっておらず、デフォルトのまま

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2023/09/05 23:51

> タイムアウトになったsession_idを取得したい。 その目的は何でしょうか?(たとえば、攻撃者がもとから無効なセッションIDを投げてきた場合に、それは記録したいのかどうかなど、動作も変わってきます)
paseri457

2023/09/05 23:55

セッションタイムアウトとなったセッションidを取得し、そのセッションidで登録していたDBのレコードに更新処理をかけたいためです。
paseri457

2023/09/05 23:58

目的を追記しました。
maisumakun

2023/09/06 00:05

> そのセッションidで登録していたDBのレコードに更新処理をかけたいためです。 このレコードは何を記録していて、どのような更新をかけたいのでしょうか?
paseri457

2023/09/06 00:08

特定の画面にて排他制御をかけるのですが、その際に画面単位で排他制御テーブルにレコードを登録して、そのカラムにセッションidが存在します。 セッションタイムアウト時にセッションidを基に対象のレコードを削除したいです
guest

回答1

0

ベストアンサー

一般的な話

セッションに有効期間が設定されていれば、最終アクセスからその期間が経過したらタイムアウトと判定され、サーバ側で無効なセッションという扱いになります。
有効期間なし(またはフレームワークで明示的に設定)の場合は、クライアント側がブラウザ(タブ)を閉じた際にsessionidを破棄します。
また、サーバ側処理で明示的にsessionidを破棄したり、クライアント側でも任意のタイミングでCookie削除したりがありえます。

このシステムの話

クライアント側で破棄されていた場合にサーバ側で完璧に検知するのは難しいので
無効なセッションがリクエストされたことを検知するだけでは、そのユーザが次にアクセスしてくるまで存在しないsessionidでずっと画面ロックされ続けるリスクもありえます。
ですので、最初から「無効なセッションが送られているかどうか」は気にしない方が全体設計としてシンプルになるのではないでしょうか。

例として

  • 排他制御テーブルにはsessionid・ユーザIDの両方登録
  • ユーザのアクセス処理時にセッション生成・再生成・破棄があれば、排他制御テーブルも追随させる
  • 画面処理で画面排他を要求・確認された際には、前処理としてsessionidが有効かフレームワークのセッション管理機能でチェックして無効だったら排他制御テーブルも追随させる

……のような方針が考えられます。

(※排他制御テーブルにユーザIDも追加する理由)
「画面ロックを取得したユーザが何らかの理由でCookieを削除した」かつ「そのセッションがタイムアウト前で有効」な場合、
そのユーザがログインし直しても「どのユーザかは分からないが有効なロックが残っているため誰にもどうにもできない」状態になります。
(システム管理者がログとDBの中身を確認してユーザ本人であると断定できたらDBに直delete文投げてメンテできる)

投稿2023/09/06 06:01

編集2023/09/06 06:14
pecmm

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

paseri457

2023/09/10 04:47

回答ありがとうございます。 画面処理で画面排他を要求・確認された際には、前処理としてsessionidが有効かフレームワークのセッション管理機能でチェックして無効だったら排他制御テーブルも追随させる 上記につきまして、 セッションの有効期限は設定で30分と指定しており、DBでセッション管理を行っています。 この場合、排他処理を実行する際に、既存のレコードに設定されているセッションidに紐づくsessionテーブルの有効期限が30分を超えているか否かで既存レコードが無効なセッションによって残っているかを判定する形でしょうか。 また、セッションの有効期限を30分で設定している場合、30分を超えたセッションでリクエストが送られた場合サーバ側でセッションタイムアウトとして処理をし、新しいセッションがサーバ側で生成されてレスポンスが返される認識です。 この場合にリクエストが送られたセッションidを取得することは難しいのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問