中の人のお遊び:サーバーシステムの一般論
概要
本ページでは一般論としてWebサイトの仕組みや挙動の説明を通じて、『どうして公式サイトを自動監視できるのか?』『公式サイトは何故こういった行為をシステム的に防止しないのか?』という疑問に対して『ある側面からの回答』を記載しておきます。 直接的に予約サイトの詳細な仕組みの話ではありませんし、具体的な実装方法やプログラム自体は掲載しません。 あくまでも、こういう仕組みなのか、という豆知識程度です。 ちなみに一部操作に関してはPCのブラウザを想定していますが、特に何か操作しながら読むページでもないので『そういうものなのか』とスルーしてもらってOKです。
もちろん、こういった話に興味がある人はIT界隈に入門して手に職をつけるのも悪くない選択肢かも知れませんね。
それと、内容に関して疑問や質問あるいはツッコミ等がありましたら中の人にマシュマロでメッセージを送っておいてください。 あまり具体的なことは答えられない可能性が高いですが、必要に応じてこのページかTOPのマシュマロにお返事にて回答いたします。
基本的な用語
- ブラウザ
- Webサイトを閲覧するためのアプリ、つまりChrome、Safari、Edge等
- テキスト
- 文字で記述した情報全般、人間が扱う自然言語の文章もテキストだし、ソースコードもテキスト
- ちなみに、これに対して直接コンピューターが扱う0と1の羅列(見やすさを整えて0~9の数字とA~Fのアルファベットを使った16進数表記もある)はバイナリと呼ばれたりする、表現次第ではあるがテキスト以外は実行用プログラムも画像も音声も動画もバイナリ扱いだったりする
- ソースコード
- アプリ(プログラム)がどのように処理するかをプログラム言語で書いた情報、一般の人がイメージする『プログラム』であり『IT系の人がプログラミングして直接作っているファイル』に相当
- リクエスト
- 要求、本ページでは特にWebサイトを見るブラウザにおいて、ブラウザ→サーバーに『これこれの情報をちょうだい』と送信する内容をイメージ
- レスポンス
- 返事、本ページでは特にブラウザから受けたリクエストに対してWebサイトのサーバー側から『こういう結果だよ』と返信する内容をイメージ
- あくまでも返事なので、相手からリクエストをもらってからでないと返す(情報送信する)ことは出来ない
ブラウザとサーバーの基礎
判っているようで判っていないかも知れない、ブラウザとサーバーの関係性に関する説明です。
Webページとブラウザ
まず当然のこととして、ブラウザでは色々なページを表示可能ですね。 そして、ご存じの方も少なからず居るかと思いますが、PCのブラウザなら『画面上で右クリック→ソースの表示(ブラウザによって多少表現は異なる)』とすると、表示されているページの本来の内容を見ることが出来ますね。 ここに表示される文字列がいわゆるHTMLと呼ばれている情報で、ここに記載されている内容に沿ってブラウザは文字の装飾やレイアウトを決めて画面上に表示しています。
しかし、HTMLは原則としてテキスト(文字情報)形式なので、画像や動画のような情報を直接扱うことが出来ません。 これらの情報は『別途ファイルを読み込んで画面上にレイアウトして表示』するようにHTMLには記述されています。 この仕組みと類似する方法で、レイアウトや文字装飾のスタイル設定だけをまとめたファイルや、ページ内の動きや仕組みを記載したソースコード(いわゆるプログラム)のファイル等もHTMLとは別のファイルとして記述しておくことが多いですね。
つまり『1つのWebページは複数のファイルで構成されていて、それらは原則として全てインターネットから取得してくる』という仕組みとなります。 当たり前のことのようですが、この『インターネットから取得してくる』というのがポイントです。
基本的にインターネットから取得してくるという部分はHTMLの取得と同様に、ブラウザが『情報をください』と依頼を送信(リクエスト)して、サーバーが『情報はこれです』と結果を返信(レスポンス)する、という仕組みになっているという点です。 例外的な通信方法はもちろん色々あるのですが、一般的なWebページでは基本的にブラウザ側が最初にリクエストをサーバーに送信して、サーバー側が結果をレスポンスする仕組みとなります。 頼まれもしないのにサーバー側からブラウザに情報を送信したり、サーバー側が勝手にブラウザ側の情報を抜き取ったりは出来ません、あくまでも『ブラウザ側のリクエストから始まる』と考えておいてください。
もちろん『ブラウザ側のリクエストから始まる』とは言え、必ずしも全てのリクエストがユーザーのブラウザ操作を必要とするとは限りません。 例えば前に記載したように最初にHTMLを読み込むとブラウザが中身を解釈して、自動的に『画像をちょうだい』『動画をちょうだい』とリクエストをしてサーバー側から必要な情報を読み込みますよね? それでも、全体の動きから見れば、最初にブラウザが『こういう情報をちょうだい』とリクエストして、その結果をサーバー側から受け取る、という形式は同じということです。
また、ここで言う『情報ちょうだい』には『サーバー側でホニャララの処理をした結果の情報をちょうだい』というリクエストも含まれます。 つまり、言い換えるとブラウザはサーバーに対して『こういう処理をサーバーで実行して(そして処理結果の情報をちょうだい)』というリクエストをして、サーバー側に処理をさせているイメージになりますね。
この辺は公式予約サイトに限らず、一般的なWebサイトであれば大半はこの仕組みで動いていると考えて良いでしょう。
Webページとプログラム動作
本来、IT屋さん的にあまり『プログラム』という用語を使うケースは多くないのですが、ここでは判りやすさ優先ということで…。 Webページ上でのプログラム的な動作、つまり情報を表示するだけではなく何らかの操作に対してページ内の情報や状態に動きがあるような部分に関する話です。
色々と説明の方法はあるのですが、ここではプログラム的な動作を『どこで動作しているか』という観点で大きく2つに分けて説明します。 つまり、ブラウザ側で動作する部分と、サーバー側で動作する部分です。
例えば、公式の予約サイトをイメージして考えると、以下のような分類ですね。
- ブラウザ側のプログラム処理
- 検索画面で『子供』の人数を1以上にすると、自動的に画面上に年齢を選択する部分が表示される
- 宿泊のカレンダー表示されている画面で年月を選択すると、サーバー側に空き情報を問い合わせて結果を表示する(当然ながらサーバー側で空き枠を検索する部分はサーバー側のプログラム処理)
- サーバー側のプログラム処理
- ブラウザから空き情報を問い合わせるリクエストを受けたら、空き情報データを読み込んで結果を返す
- ブラウザから予約実行のリクエストを受けたら、データ確認して空き枠があれば予約を実行して(予約成功した場合は)予約結果ページに進むようにという結果を返す
まず当然のことながら、ブラウザ側での処理は基本的に利用者のPCやスマホ上のブラウザで動作します。 よって、一度ブラウザがプログラム全体をサーバー側から読み込む必要があります。 つまり、ブラウザの内部的には『このプログラムをちょうだい』とリクエストしてサーバー側からプログラムをダウンロードしてすぐに実行しているようなイメージです。
これに対して、サーバー側のプログラムはサーバー側の内部で実行されていますので、ブラウザ側(つまりはユーザー側)ではどんな処理がどのように実行されているのかを知ることは出来ません。 ただ、ブラウザによる『こういう情報をちょうだい』というリクエストの内容と、『結果はこれですよ』というサーバーからのレスポンスの内容を見ることは誰にでも出来ます。 具体的な操作としては、画面上で右クリック→デベロッパーツール(開発者ツール等、ブラウザによって多少表現は異なる)として、Network(ネットワーク、通信等、ブラウザによって多少表現は異なる)を選択すると、基本的に全ての通信情報を確認することが可能です。
ここを多くの方はご存知ないのかも知れませんが、ブラウザとサーバーの間での通信内容は割と簡単に確認が可能なのです。
ブラウザ側でのプログラム動作
これもご存知の方は少なからず居るかと思いますが、このブラウザ側で動作するプログラムは多くの場合でJavaScriptというプログラム言語で記述されています。 細かい特徴は省きますが、重要な点としてJavaScriptは『プログラムのソースコード自体がダウンロードされる』ということです。
この点は少々説明が必要かも知れませんが、プログラムを実行する場合には『ソースコード(プログラム言語で書かれた文字情報)を解釈しながら直接実行』する方法(インタプリタ型)と、『ソースコードをコンピューターが実行しやすい0と1の羅列に予め変換しておいて、変換結果のファイルを実行』する方法(コンパイラ型)があります。 例えて言うなら、日本語のWebページを表示してブラウザが英語にリアルタイムで変換して表示するのがインタプリタ型、対して日本語版の情報を元にして翻訳担当の人が予め英語版のページを作成しておいてブラウザは英語版ページを表示するだけという形式がコンパイラ型、というイメージでしょうか。
基本的にJavaScriptは前者のインタプリタ型なので、ダウンロードされる情報は人間が見て意味を理解することが出来るプログラム言語の形式のファイルになっています。 前の例えで言うなら、JavaScriptは日本語ページをダウンロードして英語変換するタイプのプログラム言語なので、日本人には簡単に読むことが出来る形式の日本語ファイルを取得することが出来る、ということです。 この例えで、もしコンパイラ型の言語だとしたらダウンロードしてくるのは英語ページになりますから、中の人のような英語が苦手な日本人としては英語→日本語に翻訳しないと直接読むことが出来ない、ということになります。
ここも多くの方はご存知ないのかも知れませんが、ブラウザ上でのプログラム動作に必要なソースコードは基本的に誰でも取得することが可能なのです。 対して、サーバー側で動作しているプログラムはサーバー内部で動作させているので、外からソースコードを取得することは出来ません(セキュリティホール等がなければ)。
要点
つまり、理解してほしい点としては…
- 理論上、ブラウザ側で動作するJavaScriptの部分は誰でもソースコードを取得可能なので、IT系に詳しい人ならどんな動きをするか解析して理解することが出来る
- ただし設計書も説明書もなしで複雑な機械の動作を解析するような技術や手間は必要
- ブラウザで各種操作をすることで発生するサーバーへのリクエストと、その結果として返ってくるレスポンスはブラウザ上のデベロッパーツールで簡単に確認することが出来る(JavaScriptを解析する必要すらない)
- つまり、どういうリクエストを送信すれば、どんな結果が返ってくるという部分の調査は非常に簡単なので、空き枠検索リクエスト→空き枠情報レスポンスの中身を調べれば単純な空き枠の自動検知システムは比較的簡単に作れる
- ただしサーバー側で動作しているプログラム(ソースコード)を見ることは出来ないので、サーバー内部でどんな挙動をしているのかを直接見ることは出来ない
- リクエストとレスポンスの内容から推測することは可能だが、詳細な挙動が記載されているソースコードを見ることは出来ない
- つまり、簡単に作った空き枠の自動検知とかに公式側で対策として罠を仕掛けるなら、サーバー側に導入するのが基本、実際いくつかは罠が仕掛けt…対策が施されている
- 例えば、『放置枠が落ちるまでの時間』はサーバー側のソースコードや設定ファイルを見ることが可能なら『こういう条件で落ちる』と断言可能かも知れないが、サーバー側のソースコードは見えないので実際に予約して放置して落ちるまでの時間を計測した結果からサーバー側の挙動を推測するしかない
ということ。
ここまでの話でそこはかとなく『空き枠を監視するツール』や『空き枠を見つけたら通知するツール』の開発自体はそんなに難しいものでもないと推測出来るかと思います。 何なら『空き枠を見つけたら自動で予約するツールだって本当は簡単に作れるのでしょう?』くらいに感じますよね。 実際、そう単純でもないのですが…(苦笑
何故こうしないの?あれはどうなの?
ここまでの内容だと何か攻撃されて当然、全く穴だらけの仕組みに見えるかも知れませんが、そこまで危険でもないですし相応に理由や背景があったりします。
- JavaScriptなんか止めて、コンパイラ型の言語にしたら安全なのでは?
- 現時点で各ブラウザが対応していないので、JavaScript以外への変更は困難
- 昔はFLASHとか別の選択肢もあったが、ブラウザによるセキュリティ制御が難しいせいか、淘汰されて結局JavaScriptにまとまってしまったという歴史的背景
- 理屈上、コンパイラで変換したファイルから元のソースコードに近い情報を生成(逆コンパイル)も不可能ではないので、万能盤石とは言い難い
- コンパイラで変換した0と1の羅列はOSやCPUの種類に依存するケースがある(例:Mac用アプリはWindowsで動かない等)ので、JavaScriptのように『どの端末のブラウザでも動作する』という利便性が損なわれる
- なお、JavaScriptでも難読化という『動作は一切変更せずにソースコードを人間に読みにくい形式に変換』するような対策はある
- 例えるなら日本語の文書を全て大文字・小文字が混在したヘボン式のアルファベットに書き換えて読みにくくするようなイメージ、意味は変わらないが圧倒的に読みにくい
- 現時点で各ブラウザが対応していないので、JavaScript以外への変更は困難
- リクエストとレスポンスを隠せば良いのでは?
- まず、それは表示機能を実装しているブラウザの開発会社が考えることで、Webサイトを公開している側で設定することは一切出来ない
- そもそも『ブラウザにリクエストやレスポンスを確認可能な機能を持たせる必要はない』という考え方もあるが、それはブラウザでは表示出来ない、というだけのこと
- 開発者用ブラウザのようなアプリがあれば結局リクエストとレスポンスを確認することは可能、そうでなくともHTMLを読めばその後のJavaScript挙動も理屈上は追跡可能、よって厳密に隠すことは原理的に不可能
- 基本的にHTML等をサーバー側から取得する部分はブラウザが準拠している標準的な通信手順なのでブラウザ以外でも簡単に取得が可能、HTMLやJavaScriptを一般向けに公開している以上は隠すことが出来ないと考えるべき
- つまり、HTMLが隠せない→HTML内で取得するファイルの所在を隠せない→JavaScriptファイルを隠せない≒HTML内でサーバーに特定の処理(空き枠検索等)をさせるリクエストを隠せない、ということ
- でもHTTPSとかSSLとか暗号化して安心って謳っているよね!?
- HTTPSやSSLと呼ばれている暗号化通信は、ブラウザ←→サーバーの間で通信している内容を『その他の第三者が覗き見ることが出来ないようにする』という安全策
- 例えば、ミラコスタで備え付けのホテルWi-Fiにスマホを繋いだとして、HTTPS(SSL)でホニャララ銀行のオンライン振込手続きをしたとしても、ミラコスタのWi-Fiやネットワークの管理者(第三者)は通信した内容≒銀行残高や認証情報を覗き見ることは出来ない、というセキュリティ対策
- つまり、ブラウザの利用者に対してサーバーとの通信内容を隠すような機能ではない
- そもそもブラウザが扱う情報で重要度が高いものは利用者自身が知っている情報であるはずだし、利用者自身が知るべきでない重要情報はサーバー側が返さない(サーバー内部で処理する)ようにすれば良い話
- 人間がブラウザ操作したアクセス以外は防ぐべきでは?
- プログラムをする人はリクエストの中身を見ることが可能な以上、それと全く同じリクエストを機械的に生成したか、人間の操作で生成したかをサーバー側で判別することは原理的に出来ない
- 例えば『直前までの通信履歴(TOP→検索に推移等)を見れば判る』としても直前の通信も同様に機械的に生成されたら判別出来ないし、通常利用の範囲内でもブックマークや検索サイト等でページの途中から手動操作を開始するケースもあり得る
- 例えば『短時間でのアクセス数が多いなら機械』という条件も一定時間に対するアクセス回数を機械側で減らしたら判別出来ないし、同じWi-Fiに複数のスマホを繋いで複数の人間が手動で頑張ってアクセスするケースと機械的にたくさんアクセスしているケースの判別も極めて困難、制限が厳しいと手動操作でも誤検知で簡単にエラー画面送りにされ得る
- 現状としては『人間がブラウザ操作したアクセス』か『機械的なアクセス』かを判別することは言うほど簡単なことではなく、誤検知による手動操作への影響も考慮すると通常利用者にも不便を強いることになる可能性が高いので、『かなり緩いがアクセス数があまりにも多い場合にのみエラーにする』仕組みだけが入っている
- そう、特定のIPアドレスからのアクセス数があまりにも多いとエラー表示して、しばらくそのIPアドレスからの通信を禁止する仕組みは既に入っている、ということ
- 何故こんな危険な仕組みなの?
- 普通のIT屋さんなら、基本的にJavaScript側には本当に重要な処理はさせないので、言うほど危険でもない
- 私見ながら、TDR公式予約サイトを開発したIT屋さんのレベルとか評価に関して感覚的には普通未満なので『中の下』くらいという印象、ただし公式内部の商売的な部分の事情は不明なので酌量の余地はあるかも
- つまり、重要な処理はサーバー側で内部的に実行されるので、ブラウザで見えるような情報だけで致命的な攻撃をすることは出来ないようにしてある、ということ
- 例えば、ログインの認証は入力したIDとパスワードをサーバーに送ってサーバー側の内部で処理して認証結果を返すだけ、全ユーザーのIDとパスワードを一度ブラウザにダウンロードしてブラウザ側で認証させるような実装にするイカれたIT屋さんはまず居ない
- 例えば、全部屋の空き枠情報をダウンロードして表示したとしても最終的な予約処理はサーバー側にリクエストして処理させるだけ、空き枠ありという情報を受け取ったことがあってもブラウザ側だけで予約成功として処理する楽観的なIT屋さんはまず居ない
- 逆に言うなら、『常に公式予約サイトで世間一般に公開している空き枠情報を誰かに見られてしまう』としてもセキュリティ上の問題はない、という判断に異を唱える必然性はない
- 画面上に表示していない情報を取れたりもするが、レスポンスで返ってくる情報は原則として世間一般に公開しても問題ないと公式サイト側が判断した情報のみなので、危険性はないということ
- 故に、適切に設計して運用しているサイトならこの仕組みでも十分に安全と言えるし、公式予約サイトもその範囲に収まっていると考える
- 普通のIT屋さんなら、基本的にJavaScript側には本当に重要な処理はさせないので、言うほど危険でもない
この辺は不安や不満に感じる人も多いかと思いますが、何を以て『安全』とするのか、なのですよね。 『非公式システムから空き枠が見えてしまうのは危険だ』と言いたいキモチも判るのですが、そもそも空き枠の情報自体が一般公開されている訳ですし、原理的に公式予約サイトと非公式システムのどちらからリクエストされたのかを確実に判定することは出来ないのですよ。 つまり、ここを追求すると例えば標準的ではない通信方式を新たに開発して維持するような話にもなり、世界でここでしか使わない通信方式ということは全く過去の実績もないし、誰もセキュリティホールの確認をしてくれないし、誰も問題を解決してくれないし、いざ攻撃されたとしてもすぐには誰も手伝えないし、何なら『何で実績があって世界中で維持管理されている標準的な手法を使わなかったの?』と疑問視されることでしょう。 一般の方の感覚だと意外と思われるかも知れませんが、IT系の業界では多くの場合で『ナイショの専用システムを開発して利用する安全性<<<<皆が知っている標準的なシステムを利用する安全性』となることが多いのです(もちろん用途にも依存しますが)。 これは安全性を実現/維持するためのコスト(費用だけでなく、時間や人員、動作実績、関連システムの存在等も含む)を考慮すると、専用だから安全というよりも専用なので見落としがあるとか、専用なので詳しい担当者が会社を辞めると安全性の維持が困難とか、専用なのでアプリ側や監視システム等も全て専用に作る必要があると書くと少し判りやすいかも知れませんね。
いずれにしろ、公式予約サイトでも、ある程度の防御策はすでに導入されていますので、『完全に無防備でもなく、一般利用者に迷惑がかかったり莫大なコストがかかるほどの過剰な防御もしていない』というバランス感覚でしょうか。
何度か書いていますが、『既に一般向けに公開して誰でも確認出来る情報』なので、それを相手次第で隠すことが出来ないとしても危険ということはないですよね? もちろん『予約情報に記載したあなたの個人情報は一般公開しません』という安全性は守られています。 これが現在のブラウザを利用する上での安全性なのです。
サーバー側のお約束構成
基本的にサーバー側がどのような仕組みになっているのか、内部でどんなアプリが動いているのか、どういう挙動をしているのか、こういったことは外部の人間が知ることは出来ません。 もちろん攻撃してサーバー内部に侵入出来ているようなケースではこの限りではないですが、そのレベルまで攻撃されているなら個人情報漏洩やシステムやデータ改ざん等というもっと深刻な状況となる可能性が高いです。 現時点でそういったニュースもなく、公式から特にアナウンスもないので、少なくとも公式が検出可能な範囲でそこまでの攻撃はされていない、とは言えそうです。
だとすると、サーバー側がどんな構成でどんな挙動をしているのかはあくまでも推測の域を出ませんが、それでも一般論としてこうであろうという推測や、外部から見える挙動からの推測は可能です。 この項はそんな推測の話です。
大体はこんな雰囲気の三層構造
ということで単刀直入に、一般的なWebサイトのシステムのお約束構成です。
- ルーティング(あるいはロードバランサー)
- 受け取ったリクエストを後段にあるアプリケーションサーバーに振り分ける
- アプリケーションサーバーは複数台用意するのが普通なので、出来るだけ均等に負荷がかかるようにリクエストを分散して処理させるのが理想
- ルーティングという処理自体は極めて短時間で終わらせる必要があるので、あまり細かいリクエストの内容は見ないで後段のアプリケーションサーバーに渡すのがポイント
- アプリケーションサーバー
- 受け取ったリクエストの内容を見て必要な処理をする、ここがメインの処理を担当している部分
- アプリケーションサーバーは複数用意するのが普通なので、一部で多少処理に時間がかかっても別のアプリケーションサーバーは処理を継続出来るようになっている
- もちろん、アプリケーションサーバーが処理中の状態なら、次のリクエストがルーティングされて割り当てられても前の処理が完了するのを待つことになる
- データベース(DB)
- データの保存や抽出に特化して処理
- 複数のアプリケーションサーバーからのデータ読み込みやデータ書き込みの依頼を処理
- 基本的にDBは読み書き可能な1台のDBサーバーと、そこからデータをコピーして読み込みに利用するだけの複数台のDBサーバーに分散することがあるが、公式予約サイトがどうしているかは不明
- アプリケーションサーバーと異なり、DBサーバーは単純に複数台に分割して並列処理するのが極めて困難で、特に書き込み側の分散は難しい
- DBにはCAP定理という有名な原則があって…気になる人は調べてみると楽しいかも知れない
- このためDBサーバーの性能や設計がシステム全体の限界を決めるケースはかなり多い
- また開発が進んだ後でDBの設計(データの分類や格納方法)を大きく変更するのはかなりの困難が伴うので、稼働中のシステムを変更するのは高コストになりがち
なんて書いてもなかなかピンと来ないかと思いますので、例によってTDRのパーク内レストランで例えましょう。
- レストラン内キャスト(ルーティング)
- ゲストが入店したら『こちらのレジに並んでください』『奥のレジに並んでください』等と指示を出す
- この時点では細かい注文内容等は聞かず、あくまでもレジに並ぶことを指示するだけのシンプルな対応
- なお、原則としてゲストはこの指示に従うものとする(システムではゴネたり無視したりは出来ない)
- レジ担当キャスト(アプリケーションサーバー)
- ゲストからの注文内容と金銭を受け取って問題なければ、厨房キャストに注文内容をまとめ直して指示する
- レジは複数台あるので、どこかのレジ担当キャストがゲスト1人の莫大な注文で時間がかかっていても、他のレジ担当キャストは継続して注文を受け付けることが出来る
- 前のゲストがレジで注文&会計している場合は、後から来たゲストは列に並んで待つ(接続はしたが処理開始を待っている)
- 厨房キャスト(DBサーバー)
- レジ担当キャストからの指示に従って冷蔵庫から必要な食材を取ってきて調理して完成品をトレーにまとめて出すだけ
- 厨房キャストはゲストから直接何かを聞いたりはしない、あくまでもレジ担当キャストの依頼に従って作って返すだけ
- レジは電源と場所があれば比較的容易に店内レイアウト変更で増やせるが、厨房は備え付けの業務用冷蔵庫や食材等の搬入経路等の施設側の都合があるので大拡張することは困難(更地に戻して建築が必要)
- 本来のシステムならゲストに結果を返すのはアプリケーションサーバーなので、そこは少し違うがあくまでも例えとして
これがサーバー側の内部構成のお約束的な構成ですね。 細かく言うなら色々と工夫している部分が他にもあるとは思うのですが、大まかな基本構成としてはこんな感じになりがち、ということです。
あの現象はそういうことだったのか!
前の三層構造をイメージすると、今まで何となく理由が判らなかった挙動も説明出来るケースが増えてくるのではないでしょうかね。
- 2台のスマホで読み込みをしている際、後から操作した方が先に結果が返ることがある
- よく見かける話で『故にXXX社の回線の方が早いから有利だ』等という結論を導き出すこともあるが、実際はレジに並んでいる間に逆転された可能性の方が高い
- つまり、先に操作したスマホが並んだレジは前の方に20人分の注文をしている人が居たが、後から操作したスマホが並んだレジはみんなドリンク1杯しか注文しなかった、あっと言う間に処理された後者のスマホの方が先に自分の順番が回ってきた、ということ
- これは、レストラン内キャストが細かくレジの状態を見て並ぶ場所を判定せず、ざっくりと順番にぐるぐると並ぶ場所を指示しているだけ(処理としては軽い)という可能性を示唆している
- 11時のNN秒前に操作したら表示が早かった/スマホは表示が遅いがPCだとすぐに表示された等々…
- 基本的には前の項目と同様、多くの場合はその時にたまたま並んだレジの前にいたゲスト達の注文が簡単で早く済んだだけ、というケースの方が多いと推測
- もちろん11時のNN秒前はあまりにもハズレた数字(100秒前 vs 0.5秒前)の場合には意味があると言えるが、細かく精度を追求する意味はほぼない
- 超高負荷な日は(待合室を抜けているのに)全く画面が表示されない、検索すら出来ない、普段なら軽い画面も表示出来ない
- 大抵のシステムでは無制限に処理完了を待つことはさせず、ある程度の時間が経過したら処理ができなかったと見なして強制終了させる(タイムアウト)仕組みが入っている
- 恐らく、厨房キャストの方には大量の調理依頼がレジ担当キャストから送り込まれるが、もしゲストが『タイムアウトっす』と言って出ていってしまったら、厨房キャストには『その注文はキャンセル』として処理してもらうことになる(調理途中のメニューをそのまま別の人に提供することは出来ない)
- 基本的にゲストにとっての待ち時間は接続(入店)したタイミングからカウントするので、レジの列で待っている時間+レジで処理している時間+厨房での調理時間の合計で判断される
- つまり何が起きているかというと…
- 合計待ち時間が長くてタイムアウトすると、料理をもらえなかったゲストは大抵もう一度レジに並ぶ
- 次のゲストのレジ注文が開始するが恐らくこれもタイムアウトする(前の人が並んだ直後に並んでいるので注文処理を開始する時点で前の人とほぼ同じくらいの時間待っていたことになる)
- 結局このゲストも後ろに並び直す
- そうこうしているうちにも時間は経過しているので他のゲストも入店してきて列が伸びる
- 列が伸びているので待ち時間もさらに伸びる
- 待ち時間が長すぎて誰も処理完了出来ない
- こういう状態だったので、予約サイトではそもそも入店出来るゲストを制限する対策を入れることになった、以前は抽選で店内に入れるゲストを決めていたが、現時点ではレストランの外(待合室)で待たせて入店するゲスト数を制御している
- 最近は待合室による足切りが効果的に機能しているので、このパターン(このサイトで地獄モードと名付けた状態)はあまり見かけない…気もする
何故こうしないの?あれはどうなの?
- 待ち時間が長すぎる、同時接続数を増やせば良いのでは?
- 一般人やIT企業の社員でもあまり詳しくない人がよく口にする表現に『同時接続数』という用語があるが、そんなものを増やしても大した意味はない
- 何故なら接続しても実際にリクエストの処理を開始してもらわないと意味がない、レストランの例で言うなら接続数を増やすというのは『レストラン内のレジ行列に並ぶ場所を増やす』だけなので、基本的に処理自体は高速化されない
- 感覚的に『レジと担当キャスト(サーバー台数)を増やせ』と言っているのかも知れないが、百歩譲ってアプリケーションサーバーの台数を増やして『同時処理数』を増やすとしても個々の処理完了までの時間がかかってしまっていては意味がなく、まさに焼け石に水
- 一般的にこの界隈で重要視されるのは一定時間内に処理完了する数であり、例えば1秒あたり処理完了したリクエスト数のような性能を見るべきで、これを改善するのが重要
- 同じことを言っているように見えるかも知れないが、例えばレジ(アプリケーションサーバー)を増やしても厨房(DBサーバー)の性能限界で処理が遅くなっているのなら、完全に逆効果になる(厨房であるDBサーバーの負荷がさらに大きくなって個々の処理完了までの時間は更に長くなる)
- レストラン予約と宿泊予約(バケパ)の予約サーバーを分けて欲しい、宿泊予約のアクセス負荷でレストラン予約のキャンセルすら出来ない!
- まず情報の特性としてレストランは宿泊の情報に影響される部分がある(宿泊者枠、一般枠の区別)ので、DBを分けにくい点はある
- もちろん両方で必要な情報(ログイン認証情報等)もあるので、分割することでサーバー側の仕組みが複雑になってしまう
- そもそも費用面の問題もある、シンプルに1日分の予約でどれくらい売り上げるかを推測すると
- チケット: 2~8万人×8千~1万円→数億円規模
- 宿泊: 2~3千部屋×3万~50万円→数億円規模
- レストラン: 数百枠×数千~数万円→数百~数千万円規模
- 見ての通り、宿泊とチケットを分割して個別のサーバーとする合理性はあるが、レストラン単独でサーバーを保有するには1~2桁くらい売上が足りないと推測出来る
- 実際、チケット予約サーバーは恐らく分割されたし、現状ではパーク内のスタンバイパスやDPA等のサーバーもチケット販売側になっていると思われる
- OLCのWebサイトでセグメント別の売上を見ても判るが、柱となっているのはテーマパーク事業であり、その根本がチケット(入園してもらわないとグッズも飲食も売上が立たない)なのでここを手厚くするのは合理的
- ついでホテル収入となるが、そもそも予約によるレストラン収入は個別の項目にすらなっておらず、テーマパーク事業の飲食とディズニーホテルの売上の一部でしかないと思われる
- 何でIT予算をケチるの?
- ケチっているのかは不明ながら、前の項目に記載された売上のうち例えば1%でもITインフラに充てるとしたら、チケットと宿泊は概ね数百万円/日、つまり数千万円/月くらいになる
- 公式予約サイトがどこのインフラを使っているのかは不明ながら、中の人の経験上で十万人くらいが一斉にアクセスしに来る(パーク入園時)負荷を捌くなら数千万円/月というコスト感は割と納得出来るレベル
- もちろんクラウドサービスか自社構築か、もっと安い/高いサービスがあるのも判るが、ざっくりと『異常に安い、ケチっている』『ムダに高い、贅沢すぎる』という印象はない
- 大まかには巨大なDBサーバー1台、アプリケーションサーバーは数台~数十台、前段にロードバランサーとCDNに通信費用も考えて、他にキャッシュサーバーやストレージ周りに昨今の円安も加味すると、概ね数千万円/月~は妥当なところと感じる
- この他に、保守運用と継続的な開発(新機能、セキュリティ対策等)の人件費で…ざっくりと1千万を切っていたらさすがにケチっている感じはするので、これも数千万円/月程度であって欲しいところ
- そう言えばDPAの事前予約なんて話もあり、クルーズ周りの予約システム開発も遠からず必要となるので、確実に中では色々と開発しているはず
- そもそも、現状でも予約自体はほぼ全て埋まっていくので多額の費用をかけて少しの性能を上げるメリットも少ない
- 以前は地獄モードで誰も予約処理を完走出来ない状態にもなっていたが、ここで無理にリソース増強に舵を切らず、足切り抽選→待合室による見える化等に費用をかけたのは合理的と言える
- つまり、待合室で全体の負荷を調整して、大まかには妥当な費用感で動かしている、そこまでケチっていることもなさそう、というのが中の人の印象
- とは言え、いずれにしろ推測の域は出ないが、1%でも使ってくれれば十分戦えると思われるのでケチっているとも思えない
- それでも何時間も利用者を待たせるのはダメでは!?
- 最近は待合室の待ち時間も改善傾向ではあるので、何時間も待つ=一括開放として考えるとして…
- ただ『宿泊予約やバケパの影響でレストラン予約をいじれない』という問題はある、とは言え時間の設定的に主にキャンセルや予約変更の手続きなので必ずしも致命的とも言い難いところか
- そこは費用と体験のバランスという商売的な判断ではあるが、極論すると『イヤなら行かない』という選択肢を取る人が増えれば変わってくるはず
- ポイントなのは、『イヤなら行かない』という選択肢を取る人が増えれば予約は取りやすくなるということであって、この時点ではまだ公式側は特に大きく困ることはない、という点
- もちろん、宿泊予約やレストラン予約の体験がダメ過ぎて、もう二度とパークに行かない/チケットも買わないとなれば間接的に商売へのダメージはある
- また、システム費用を無視して体験にフォーカスして考えた場合、『開始1分で全て埋まって予約が取れなかった』のと『何時間も待たされたが予約が取れた』という可能性が残るのと、どちらがベターかというのは判断が難しい
- 現状だと『開始前から張り付いていたのに2時間経過しても入れなかったので諦めた』『開始1時間後に入ったが5時間待たされて予約は取れた』のような可能性もあり、なかなかのカオス
- とは言え、仮に待ち時間を改善出来たとしたら次は『開放後1分で全部埋まっていた、普通に操作しても予約出来る訳ないシステムなんてダメでは!?』となることは容易に想像が可能
- 結局は何を優先して、何を切り捨てるのかという話と費用面での合理性で現状があると推測
- 最近は待合室の待ち時間も改善傾向ではあるので、何時間も待つ=一括開放として考えるとして…
お散歩大好き棒人間の待合室
大まかには前の項目で記載したような三層構造としていると思うのですが、TDR予約サイトの一括開放による予約開始タイミングには想像を絶するほどのアクセスが集中すると思われます。 どうやっても捌ききれないので、以前はコッソリとサーバー側で抽選して中に入れる人を選択する仕組みでしたね(入れない人には高負荷を示すエラー画面が表示される)。 それが現在は待合室に変更されて、時間を経過すると中に入れる、というシステムになりました。
挙動や対策の詳細は待合室のページに記載どおりなので、この項では動作上の仕組みを考察してみましょう。
待合室は三層構造の前段
まず、基本的なこととして待合室は前述の三層構造のサーバー側システムのさらに前段に配置してあります(厳密に言うと色々な表現の仕方があるのですが、あくまで判りやすさ優先のイメージで)。 つまり、ブラウザは一番最初に待合室のサービスにリクエストを投げている、というのが実情です。 この時点で待合室では『現在の負荷は待合室を展開すべきか?このブラウザは待合室を抜けたか?』をチェックして問題なければ、後ろにいる実際の処理をするサーバー群にリクエストを通してあげる、そんなイメージですね。
はい、これもレストランで例えるなら、レストラン入口の外側に立っているご案内キャストさんみたいな感じです。 『レストラン内を見渡した感じの混雑状況』と『当日の入園者数等の状況から導き出した混雑予想』の2つに従って、ゲストをスルーして入店させるか、レストランの外に並ばせるかを判断します。 つまり、『今日はダッフィーグッズ発売初日でスーベニア狙いのゲストが大量に来る』と予想されるなら早めに外に列を形成させる(1時間前から待合室送り)し、『今日は平日で灼熱の猛暑日、入園者数も少ないからあまり混雑はしない』と予想するならレストラン内にスルーして入ってもらう(待合室スルー)、という感じですね。
ただ、入口のご案内キャストさんは全ゲストそれぞれの注文内容を確認したりはしませんし、レストラン内の状況も外で待っている行列の人数も大まかに眺める程度しか把握は出来ません。 よって、ご案内キャストさんに『この待ち行列は何分くらいで入れますかね?』と聞いても正確な回答は期待出来ません。 仮に『大体1時間以上ですかね』と目安を教えてもらったとしても、実際には10時間待ちとかもあり得る、ということです。
これは例えば、レストラン内を見た感じでは混雑はそこそこだったとしても各ゲストが非常に手間のかかる注文を大量にしていて行列が進んでいかない、レストランの外に作った待ち行列に案内した人数はざっくり把握していても『多分これくらいの人数は諦めて離脱するだろう』という見立てがハズレて予想より多くのゲストが待っている、等々の事情で予想は大外れする、という感じですね。 あくまでも店内をチラっと見る程度、外の列を眺める程度、個々の事情は把握していませんしリアルタイムに行列状態や店内から出ていく人数を把握している訳でもないようですから、精度に期待してはいけませんね。 ただ逆に言うと、詳細な情報確認や難しい状況判断は一切していないので、ご案内キャストさんは短時間で『並んでください』『中でお待ち下さい』を判断出来ますし、数人のキャストさんでも莫大な人数のゲストを短時間にご案内することが出来ます。
何故こうしないの?あれはどうなの?
- 待合室の処理が遅いから待ち時間が長いのではないのか?
- 待合室の処理は極めて軽く、極めて単純な挙動になっていると考えられるので、ここの処理の重さはほぼ無視して良いレベル
- 例えて言うなら、入口のご案内キャストはゲストそれぞれの注文内容(リクエストの中身)を見ないし、レストラン内のキャスト(アプリケーションサーバー、DBサーバー)に状況確認もしない、単に『入れるか判断する』『列に並んでもらう』『推定待ち時間を伝える』だけ
- よって、待ち時間が長いのは単に外で待っている人が多いパターンか、レストラン内を混雑させすぎないように外に並んでもらう割合を増やしているパターンと考える方が妥当
- 待合室の待ち時間はもっと正確に出そうよ
- 全体的にある程度の経験則で計算してしまっている印象はあるので、その時点での事情によって多少ブレるのは仕方ないところか
- 『1時間以上』という表示はかなり雑ではあるが、そもそも待ち時間が長くなるほど精度が出せなくなるので『すごく長い時間待つよ』という以上の意味はないと本来は考えるべき
- もちろん1時間以上であっても詳細な時間を表示することは可能だとは思うが、誤差2倍で『30分待ち表示が1時間待ち』になるより『3時間待ち表示が6時間待ち』になる方が絶対的な待ち時間の増加量が多いので、あえて雑な表示で濁していると思われる
- そもそも予約ガチ勢は待ち時間が判っても結局待つしかないし、1時間以上と言ったら1時間以上なのだからハズレてはいないケースが多いとも言える
- つまり、公式予約サイトを普通に利用している範囲では『3時間待ちだったのに10時間待っても入れない!』という話はあり得ない、『1時間以上としか書いていないが10時間待っても入れない!』なら少なくとも誤った情報提供はしていない、という表現上の話
- ただし、分単位だった待ち時間が伸びて開始タイミングに間に合わないケースは厳しいと思うので、公式予約サイトの人による設定変更は早めに済ませておいて欲しいところではある
- 待合室の待ち時間が急に大きく延長されるのは、不正に割り込んで前に入ってくる人が居るから?
- 厳密にどんな方法が存在しているか不明なので断言は出来ないが、割り込みされている可能性は低い(そういうセキュリティホールはない)と考えられる
- 一番の根拠としては、特に一括開放の際に発生する時間が伸びるタイミングが開放タイミングよりかなり前である点、敢えてここで割り込むより10分前くらいに割り込んで中に入る方が効率面でも安定性の面でも有利なはず
- また1人や2人が割り込んだところで待ち時間が何倍や何十倍にもなるのは計算に合わない、かと言って1人や2人で何百何千という単位のブラウザを不正に割り込ませるメリットもないし、何千人が既に知っているような方法があるならここまで困っている人が増えることもないと考えるのが自然
- よって、待ち時間が一気に長くなるのは公式予約サイトの中の人による待合室の設定変更による現象と考えるのが妥当と思われる
- でも不正に割り込んだり、待合室を素通りしている人って居るよね!?
- 中の人の知る範囲ではその方法に関する情報はないが、全知でも全能でもない中の人なので『実はスペシャルな手法がある』という可能性を否定することは出来ない
- ただ、待合室のページにも記載してあるとおり、そもそも待合室に飛ばされないページが存在して、その対象ページは変更されることもあったので、現時点で何か待合室を出し抜く方法がないとは言い切れない
- とは言え、基本的に待合室の仕組みは極めてシンプルで、シンプルであるが故に誤魔化したり、裏をかいたりする余地が少ないとも考えられる
- つまるところ、そんな方法があったら教えて欲しいくらい、ということ(苦笑
- でも自動監視している人達が居るのはどういうこと?待合室対策があるってことだよね?
- 可能性としては2つ、『待合室を抜けるまで待つ部分も自動化』しているか、『そもそも空き枠検索処理リクエストが待合室の対象外』になっているか
- 中の人の印象として後者である可能性が高いと考えている、根拠としてはカレンダー画面で前後を繰り返すだけなら待合室の時間制限を超えても放り出されなかったという挙動から『待合室の制限時間を超過しても空き枠検索処理リクエストは正常に動いている』と推測出来る
- ただし、そのまま予約することが出来なくなる時間制限も存在するので、無制限にカレンダー移動で待合室を無視してキャンセル拾い継続する作戦は非推奨
- よって、空き枠の自動監視だけであるなら『そもそも待合室を無視出来るのではないか』と推測するのが妥当
空き枠の自動監視システム
つまりは公式が提供しているシステム以外の、一般利用者による非公式な空き枠の自動監視システム、ということですね。 これは良くも悪くも議論のあるところですよね。
これまでの内容から空き枠の自動監視システム自体を作るのはそこまで難しいことでもないとご理解いただけたかと思います。 ある程度の知識と時間がある人なら難なく作り上げることが出来るでしょう。 (ただし予約確保まで自動で進める前提となると多少難易度は上がると考えられます)
その挙動をシンプルに言うと、予約サイトにアクセスしているブラウザのフリをして空き枠確認のリクエストを投げて、受信した結果に空き枠があれば何らかの方法で通知する(Xに書き込み/LINE送信/Webページ公開等)、これをひたすら繰り返すというだけです。 精度はリクエスト間隔を短くしたり、同一のプログラムを複数起動したりすることでリクエスト数を増やせば、発見までのタイムラグが短くなり空き枠検知の精度も上がりますね。 シンプルなシステムであれば、ブラウザよりも軽い動作でこれらを動かすことも可能なので、複数起動させることも難しい話ではなさそうに思います。 もちろん公式側が用意した細かな罠を回避する必要はありますが、単純化してしまえばこれだけの仕組みなのですよね。 そして空き枠情報は公式予約サイトが世間一般に対してインターネットで公開している情報ですし、ここまでに説明した通りで監視に必要な情報の入手自体も比較的単純なので、監視するリクエストとレスポンスの検証の仕組みの開発はあまり困難なことではありません。
むしろ逆に、こういった自動監視システムからのアクセスのみを公式の予約サーバー側で防ぐ方が原理的に極めて困難です。 極論するなら、これを防ぐために連結決算で赤字になるくらいコストをかけても良いのか、一般の利用者にも現在より不便な仕組みとしても良いのか、というレベルですね。
何故こうしないの?あれはどうなの?
- でも、自動監視システムが予約サーバーに負荷をかけているよね?
- 理屈上はYESではあるが、それは普通の利用者がブラウザで普通にページを開いても同じこと
- ただ、1人が作った自動監視システムが10個のブラウザと同じ負荷をかけているなら、普通に1人で1つのブラウザで見ている際の負荷の10倍と言うことは出来る
- いや、自動監視システムの情報を一般公開すれば公式サイトにアクセスする利用者が減るから負荷は下がるでしょ?
- そういった自動監視システムからの情報を利用する側の行動を考慮するとYESと言って差し支えないとは思える
- つまり、こういった自動監視システムが公開している情報を利用するような層は、元々も張り付いて必死にリロードしてキャンセル枠を探すようなタイプだった可能性もあり、そういう利用者が公式サイトではなく自動監視システムを見るようになるなら負荷軽減効果は高いという意見にはある程度の説得力があると考えられる
- 自動監視システムの利用者トータルで見ると、むしろ『未だに手動でリロードしまくっている利用者の方が負荷をかけている』という過激な意見にも一応は筋が通っていると言えなくもない
- ただし、自動監視システムを公開した人間にそこまでの公益性を求めて良いのかは甚だ疑問
- でも、これって法律/規約に違反しているよね?
- 残念ながら中の人は法律や規約に関して、その解釈や適用に関する専門家ではないので断言は出来ない
- じゃ、中の人は賛成派なのかっ!?
- 正直、賛成も反対もしないが、人間の時間をひたすら画面リロードに費やさせるキャンセル拾いという作業は馬鹿げているとは思う
- 人間の時間はもっと有意義なことに活用されるべきで、あまりにも生産性の低い作業を強要する公式側に問題がある、という見解
- だから中の人はキャンセル拾いは最初から捨てて、開放タイミングの勝負で確保するようにしている
- つまるところ、予約は全部抽選にすれば良い/複数取得はNGにすれば良い/宿泊経験がある人はNNヶ月は予約出来なくすれば良い!等々
- 色々と予約の早いもの勝ちに物申したいキモチは判らないでもないが、抽選はアカウントを大量確保した業者に軒並み占有されるのは目に見えているので下策と思われる
- 予約数や過去の予約でペナルティをつける方針も、公式側の商売としては『お得意様ほど重度なペナルティを課される』ことになるので、これも商売的にはかなりな下策
- 正直、X(Twitter)上で賢い人達が呟く『予約システムはこうすれば良い!』という素晴らしい発想で、今までに共感出来るアイデアを見たことがない
- どこかにも書いたが結局は『誰を捨てて、誰を有利にするか』という話でしかなく、副作用による商売的なダメージの方が大きいように思われる
- ただ、キャンセル拾いのみに関して言うなら『キャンセル等による空き枠は特定時刻に開放する』という公式ルールを決めて発表してしまう方が良い気はする
- 例えば『毎日22時にその時点でキャンセル等によって空きになっている枠を全て開放します、それ以外の時間帯にキャンセル枠は公開しません』と宣言してしまうとか
- 開放する日程の範囲は多少制限しても良いかも知れないが、特定時刻に勝負すれば良いと判っていれば空き枠通知も無意味だし、そもそも四六時中リロードする必要がなくなる
- そのタイミングでアクセス集中はあるかも知れないが、毎朝11時にもアクセス集中は発生しているのだし、スペシャルな部屋やバケパの一括開放ほどの集中にもなるとも思えない
- このアイデアがベストとも言い切れないが、公式の方で長時間キャンセル拾いをする必要がない仕組みにしたら良いのではないか、とは思う
- ちょっと待って、待合室の項では『そもそも空き枠検索処理リクエストが待合室の対象外』ってあったから、待合室の対象にすれば自動監視システム対策になるのでは?
- 単純に空き枠検索のリクエストを発行しているだけの自動監視システムへの対策としてなら効果が期待出来ると考えられる
- ただし、もう一つの可能性である『待合室を抜けるまで待つ部分も自動化』される(あるいは既に自動化されている)と、対策としては完全に無力化されてしまう
- また副作用として一般利用者も待合室を抜けた後の制限時間(15分)を超えた状態でのカレンダー移動による空き枠確認が出来なくなる、とは言える
- ただし、現在の挙動において上記の状態で空きが見つかっても、予約の成否は待合室を抜けて画面表示したタイミングからの経過時間次第
- つまり、現在の挙動なら待合室の制限時間を超えて検索していたが予約出来ていたケースもあり得る、もし挙動変更されると制限時間を超えた検索ができなくなり待合室に戻されることになるので、そもそもこのケースが存在しなくなる
- 逆に、今までだと折角空きを見つけたのに予約操作をすると待合室に戻されるケースも挙動変更により存在しなくなる、要は無駄にカレンダーをリロードするケースがなくなるというメリットがあるとも言える
- 『あれ?だとしたら、この制限は入れた方が良いのでは?』とも言えるが、主にサーバー側におけるシステム内部の細かな制限事項等で実現困難という可能性は残っている
- ということで、中の人の見解あるいは推測としては『公式予約サイト側の自動監視システム対策としては検討の余地あり、ただし盤石ではない、そこはかとなく設定変更をミスすると致命的な状態になるリスクや実装コストの問題で実装を回避しているのかも?』と言ったところ
レストラン空き枠の自動監視システムの可能性
あまり見かけないですよね、プライオリティ・シーティング対応レストランの空き枠の自動監視システム。 公式予約サイトと違ってレストラン売上によるシステムコスト負担を意識する必要がないITに詳しい一般の皆様なのですから、誰かしら作っていても良さそうなものだと思いませんか?
もちろん、これには理由があります。 細かいことを言うと面倒なので単刀直入に言ってしまうと、宿泊予約は『1ヶ月分』の空き枠を1回のリクエストで取得する比較的自由度の高い方法が存在しますが、レストランの空き枠にはそれがないようなのです。 つまり、レストランの空き枠検索をするには1回のリクエストで1日分の空き枠を取得する機能しか存在しないので、仮に3ヶ月前開放だとするとおおよそ90回のリクエストで90日分の空き枠を取得する必要があるのですよね。 対して、宿泊予約なら4ヶ月分の取得は1ヶ月分ずつ4回のリクエストで空き枠を取得することが可能なので、単純に空き枠の検索という意味では宿泊予約の方が圧倒的に少ないリクエスト数で対処が可能なのです。
なお、厳密に言うと宿泊特典(いわゆる宿泊枠)のレストラン空き枠は別に存在しますので、こちらも観測するとなると一気に呼び出し回数が増えそうです。 中の人も詳細に調査はしていませんが、宿泊枠の確保はトラベルバッグとなるかと思うのですが、トラベルバッグからだと1回のリクエストで1レストラン1日1時間帯(朝昼夕)分の情報しか取得できないようです。 しかも宿泊枠なら4ヶ月前から検索可能なはずなので、概ね120日分×2(主に昼と夜)×宿泊枠対象レストラン数となるので全体を見ようとすると途方もない回数のリクエストが必要になりますね。
宿泊枠は除外するとして、もしレストランの空き枠確認で全期間検索したいなら90回のリクエストが必要で、高精度で検出するにはかなり短い間隔で90日分の確認をしたいので、どうしても同じ空き枠監視プログラムを大量に並列動作させる必要があります。 ここで効いてくるのが、前にも記載した『特定のIPアドレスからのアクセス数があまりにも多いとエラー表示して、しばらくそのIPアドレスからの通信を禁止する仕組みは既に入っている』という点です。 さすがに90日分のリクエストを並列処理して大量に呼び出すと、この制限にかかってしまいますね。
対策としては単純で複数(あるいは大量)のIPアドレスを用意すれば良いのですが、これを無料で実現するのは結構困難だったりします。 逆に言うと、金銭的な問題(と公式予約サイトにかかる負荷)を無視することが出来るなら、レストラン空き枠検索システムも比較的シンプルな方法で実現は可能だと思います。
もう少し穏便な方法としては、空き枠監視の対象期間を短く取ってリクエスト数を減らす方針もあるかも知れませんね。 あるいは、空き枠の検索対象レストランの数も絞り込めば、公式予約サイトの負荷も多少は下がるかも知れませんか。
とは言え、こういった事情もあるので、レストランの空き枠の自動監視システムの方は作るのは簡単でも罠を避けつつ動かすのが面倒なので、現状ではなかなか難しいのではないでしょうかね。 もし、レストラン1種類分でも良いので1回のリクエストで1ヶ月分の検索が可能な手法が見つかれば、レアなレストランだけでも監視すれば良いのでレストランのキャンセル拾い界隈も一気にシステム化が進むかも知れませんが。
何故こうしないの?あれはどうなの?
- でも、レストラン予約で1週間分の空き枠を表示する画面があるよね?
- 確かにレストランの予約では1週間分を表示する画面があるが、あの画面は1日分のリクエストを7回ずつ朝昼夕に対して実行するという挙動になっている
- つまり、画面は1つでも内部的なリクエストは7×1~3回実行しているだけなので、残念ながら自動監視システムに応用してリクエスト数を減らすことは出来ない
- 確かにレストラン予約は1ヶ月分の検索が出来なくて不便だ、公式予約サイトは改善すべきだ!
- キモチは判らないでもないが、まずは日程を決めて宿泊や入園チケットを購入、その後でレストラン予約をする、という前提でサービス設計されていると考えられる
- 最初にレストランありきで予定を立てる人は少数派で、特にホテルレストラン利用のみのゲストを主軸に置いたサービスではない、ということ
- 売上的にもレストラン単独で大きなことを言えるほどでもない、という側面もある
- また、システム的にも1レストランで、最大で朝昼夕の3つ、それぞれに複数の時間帯枠があるので、システム負荷の面や利用者にも見やすい画面構成という意味でも1ヶ月分表示は難しいと考えたと推測出来る
- もしレストラン予約の仕組みが自動監視しにくいなら、宿泊予約も同じような仕組みにすれば自動監視を排除出来るのでは?
- これを書きたいがために、この項目を追加したというのが本音だが、単に対策したいだけならYESと言って差し支えないかと考えられる
- ただし、これは宿泊予約のカレンダー表示で空き枠検索する機能をなくす必要があるということになり、利用者に大きな不便を強いることになる
- 宿泊予約のカレンダー画面は1部屋で1ヶ月分ではあるが、これを残すとレアリティの高い部屋に絞った自動監視システムを駆逐することが困難になるので、1ヶ月分検索する画面や機能は全滅させる必要がある
- 宿泊の利用者数とレストランの利用者の規模感や利用動向の比較で考えると、宿泊予約でカレンダー検索出来ないのは致命的な欠陥とも思えるので、この方針での対策は優れているとは言い難い
中の人的な近況とか感想とか
この項のみ、多少専門用語が出てきても解説はせず、思うがままに意見を記載する無差別級な話題です。 最近は中の人もあまりモチベーション高く予約サイトを見ていないので、あれやこれやの駄文ですね(苦笑
現状の攻撃側
少なくとも、DBに直接アクセスするようなセキュリティホール(SQLインジェクション等含む)は今のところ見つかっていないと思います、というか思いたいです。 なので、基本方針はブラウザが叩いているWebAPIベースでの争い、これが現状における広義の『攻撃』というところでしょうね。
よって、理屈上はアクセスログを見ればある程度の特定は可能なので、それなりに攻撃側の目星はついていると考えて差し支えないかとも思います。 それでも明確に何かペナルティをもらったという話を聞いたこともないので、今のところ公式の動きはなさそう、ということになるのでしょうね。 許容しているというか目をつぶっているというか、内部事情は謎ですが、以前は大っぴらに攻撃手法の開示や金銭の授受を謳っていたりも見かけましたが最近はどうなんでしょうかね。
現状で目につきやすい自動監視システムはさておき、問題は予約確保までの自動化、システム化でしょうかね。 ぶっちゃけ、人間による手動操作で出来ている以上、ある程度の自動確保は可能だと思いますし、実際に確保までしている人も居ると考えるのが妥当でしょうね。 特に11時直後とかは相変わらず手動ではあり得ない速度で掴まれたりしているのでしょうかね、最近は本当に全く様子を見ていないので不明ですが。
アプリ専用サイト
アプリ側に情報を提供している部分、具体的にはアトラクションの待ち時間や通販サイト系の情報ですが、ここもさっくり解析されているのでしょうね。 中の人は一切見ていませんが、Charlesで抜いてしまえばSSLでも通信内容を自分で覗き見ることは恐らく可能だと思いますので、この辺からWebAPIを追跡して抜き出すことは可能でしょう。 自分で意図的に中間者攻撃を成功させる手法は如何ともしがたいですし、SSL自体が自分を中間者にする攻撃を守る必然性もないので仕方ないところですが。 なお、もしかしたらAndroidやiOSの開発者向け機能等の何らかの操作でもWebAPIを抜けるのかも知れませんが、中の人はアプリ側は全く詳しくないのでそちら方面にも穴はあるのかは判りません。
という状況なので昨今の雰囲気からすると、この辺も解析されて通知するような仕組みは存在していると見て良さそうでしょうかね。
繰り返しますが、中の人はこの辺を一切見ていませんし、見る予定もないですね。 情報提供サイトを作るくらいならアプリを起動してもらった方が良いですし、アトラク待ち時間の過去情報を積み上げて何かしようとも思いませんから。 また、通販の販売情報の方もアプリで見れば良いレベルでしょうし、早いもの勝ち購入は入園必須ですし、以前の20周年ピース・オブ・ザ・ドリームに懲りて40周年ピース・オブ・ザ・ドリームは先着順ではなく抽選にしましたので解析してどうにかなるものでもないでしょう。 そもそも、そこまで細かな価格変更や売り切れ情報が必要な層といえば、いわゆる転売屋さんくらいなものではないでしょうかね。
まぁ、本気で広告収入を狙いたくなったり、転売屋さん相手に商売を考える(あるいは自ら転売屋で一旗揚げる)なら、調査分析サイトのようなものを作っても面白いかも知れませんね。
待合室と遊ぼう
以前は純粋に面白そうだった待合室の攻略ですが、こちらはモノがシンプルなだけに付け入る隙が少ない気はしますね。 スプホ一括開放の頃はここを抜ける手法さえあれば前述の予約確保勝負に持ち込めたのに、という人は多かったかも知れません。 中の人としては自分が確保したい日程においては全く困ることがなかったので良いのですが。
そう言えば、夏頃にトラベルバッグページを素通しさせるという暴挙がありましたが、この素通りになるページを間違えて設定してくれると大きな穴になりそうではありますね。 さすがに今後はそういった設定ミスに期待するのも難しいかも知れませんが。 むしろ、宿泊予約を掴んだ後のワンバケ選択ページで待合室に戻す設定は変更するべき、だと思うのですが…(苦笑
とりあえず、普通に完全スルーしようとしても、初手のシンプルなCookie判定(でしょうかね?)される部分を抜けられないことには如何ともしがたい気がしますね。 伝統的な攻撃手法としてありがちなUser-Agentをサーチエンジンのロボットにするとかも塞がれていると聞いたこともありますが、最近はどうなのでしょうかね。
で、中の人の現状としてですが、正直なところ完全に待合室をスルーする方法を調査するモチベーションもあまりないのですよね。 最近は割と短時間で入れてしまいますし、長時間のキャンセル拾い監視をするつもりもありませんから、必要なときに入れるなら全く問題にならないのですよね。 以前のスプホ開業時の予約争奪戦のようなレベルの血沸き肉踊る楽しげなイベントは当分なさそうですしね。 強いて挙げるならクルーズ予約争奪戦辺りでしょうか、現在の予約サイトの対象とするのかは不明ですが。
車輪の再発明よりは
既に自動監視システムを作成された方のサイトは存在するようなので、敢えてこれを作るのも面倒な話ですよね。 ちょっとした趣味の延長や内部挙動を見るための教材ならともかく、敢えて本気で作る必要もないように思われます。
とすると、むしろ既存の自動監視システムからトリガーさせて予約を掴む、というような仕組みを作るような方針を採用する人が遠からず現れる(あるいは既に存在する)のではないかと推測します。 待合室や諸々の制約を考慮すると超えなければならないハードルはありますが、車輪の再発明をするよりは興味を惹かれるところではないでしょうかね。
仮に自動監視システム側から締め出されたとしても、そうなってから諦めて自前で実装すれば済む話ですし。
『監視機能は既存のシステムに任せて、予約だけを誰より早く掴み取るシステム』という響きは、これもこれで宗派に関わらず予約界隈の人が聞いたら激怒しそうですが(苦笑