質問: プログラミング初心者です。 ID•PWを登録してログインする制度になっているWebページで、ログインおよび登録する際のHTTPリクエストの仕組みについて質問させていただきます。 ### 考えられる部品 一般的なログインシステムは、以下の4つの部品で構成されていると予想しています。 A. ログイン画面のhtmlページ(フォーム内容の処理プログラム付き) B. クライアントのID•PW情報を保存するデータベースファイル(CDBとする) C. ログインページに入力されたID•PWを元に、CDBを参照して登録&ログイン処理をするプログラム(R &LPとする) D. CDBとRLPを置いておくサーバー ### 素朴な発想 ログインの仕組みについて考える時、素朴な発想としては、以下の通りになると思います。 ・CのR &LPには、ID•PWに相当する2つの引数に持つ『照会関数(shokai(id,pass)とする)』が記述されている。 ・Aのscriptに以下のような処理が書かれている: 「まず、headエレメント内のscriptタグに、外部ファイル『R&LP』のURLを外挿する。 ログインボタンが押された時、ログイン画面で入力されたID•PWを、getElementByIdによってgetし、それを変数id, passに格納する。その後、外部ファイル『R &LP』の照会関数を、以下のように呼び出して使う: shokai(id,pass); 一致すれば、照会関数によって、ログイン先ページがオープンする」 ### しかし、一般的には... しかし、少し調べると、一般的には、 「Aでは、ブラウザが、 ログイン画面に入力されたフォーム内容(ID•PW)を、HTTPリクエストというHyperText標準送信機能を利用して、 R &LP(C)に送るだけ(つまり、処理系はR&LPに全て押し付ける)」 「R &LPは、受信したID•PWを引数として、内部の処理プログラムに従って、CDBとの照会を行う。ログインの場合、一致すればログイン先ページのURLを、一致しなければ『IDまたはPWが間違っています』というメッセージを、それぞれ返り値として出し、それをHTTPレスポンス機能を使ってブラウザに送信する」 という方式を採用しているようです。 ### 質問 知りたいのは、HTTPリクエストの受け方です。HTTPリクエストに乗せられて送信されたID•PW情報は、サーバー側(つまりR&LP)に届いたとき、サーバー側のスクリプトで宣言した適当な変数に格納することができるようになっているのでしょうか? また、逆にHTTPレスポンスに乗せられて送られる戻り値を、クライアントスクリプト(つまりA)で受け取る標準メソッドのようなものが用意されているのでしょうか? ご回答お待ちしております。
回答: > > 知りたいのは、HTTPリクエストの受け方です。HTTPリクエストに乗せられて送信されたID•PW情報は、サーバー側(つまりR&LP)に届いたとき、サーバー側のスクリプトで宣言した適当な変数に格納することができるようになっているのでしょうか? > > > Yes 他の質問でバックエンドPHPを想定しているようなのですが、Webサーバ(Apach/nginx)がphpにリクエストを処理させるとき、PHP側で`$_POST`(`$_GET`,`$_REQUEST`)に送信されたデータが格納されていることを前提にできます。 言語問わず、サーバ側のプログラムではFormで送信されたデータが特定の、予約された、領域にあるはずだ、という前提でプログラミングできます。 > > また、逆にHTTPレスポンスに乗せられて送られる戻り値を、クライアントスクリプト(つまりA)で受け取る標準メソッドのようなものが用意されているのでしょうか? > > > ajax的な処理をするならそうですね。例えばXMLHttpRequestでやるなら`responseText`など。 ただ、ajaxじゃなくて、formをsubmitした場合などは、HTTPレスポンスとしてページ(HTML)そのものが帰され、その中の表現値として、戻り値が書かれていることも大いにあります。 余談 素朴で考えたことも、おそらく実装すれば、大差ないと思います。例えばR&LPのshoukai()は、実際の照会はサーバサイドでやるはずなので(まさか全ユーザ情報をクライアントに送ってないでしょうから)、Cがクライアントjsにコーディングされていたとしても、キモになるid/passのマッチングは、**サーバに押しつける**ことになります。 さらに「照会関数によって、ログイン先ページがオープンする」とのことですが、そのページそのものアドレスやそのときにログイン認証させたことを示すデータ(cookieに保存すると思われる)は、通常サーバから(認証の情報は通常どころか必要的に)送られてきますので、やはり、この部分も、現実にモノ化すれば、一般には、の方式にたどりつかざるを得ないです。 総じて、クライアントとサーバを分離して、シークエンスを確認すれば、齟齬が解決できると思いますが、机上で悩むより、適当な参考書を図書館でかりてきてでも何か作ったほうが早いです。