プロが教えるわが家の防犯対策術!

現在、会員制のWebサービスを作成しています。

まだ初期段階ですが、今は管理者用のユーザー管理ページに着手しており、サーバーサイド、クライアントサイド合わせて、およそ7割程度完成しているいるところです。

このページの現時点での実装では、ユーザーの削除、復活、パスワードリセット、登録情報の変更、新規ユーザーの登録といった全機能でajaxを使っています。

また、処理対象のユーザーは一覧のテーブルをクリックして選択するのですが、このクリック時にサーバーからユーザーの詳細情報を取得しており、ここでもajaxを使っています。

要するに、1ページ取得したあと、そのページ内でサーバーと通信を行う必要が生じたら、それはすべてajaxを使うという決まりです。

そこで、ajaxの運用についていくつかわからない点があり、質問させて頂きます。

(1)
会員専用ページという性質を考えると、ajaxでリクエストを送信した際にも、サーバーサイドではそのリクエストに対するセッションが有効かどうかをチェックする必要がありますよね?
一般的な会員向けWEBサービスでは、"ページ遷移毎"だけでなく、"ajaxでの通信毎"でもセッションのチェックを行うものなのでしょうか。

(2)
ajaxでの通信時にセッションの有効性をチェックした結果、すでにタイムアウト等でセッションが無効な場合、一般的にはどうするべきなのでしょうか。
個人的にはlogoutページにリロードしたいと考えているのですが、このようにするには、サーバー側がレスポンスを返すときに、{error:{code:'1',message:'session_out'}}のようなJSONを返して、それをjavascript側で確認し、location.hrefを書き換える、というような流れで処理を行うことになるのでしょうか。

(3)
そもそも、今回のように「1ページ内で生じるサーバー間通信は全てajaxで補う」という考え方は、一般的なものなのでしょうか。
なにが言いたいかというと、"セキュリティ等を考慮してajaxを使うべきではない処理"と"ajaxを積極的に使うべき処理"(もしくは、"ajaxを使っても差し支えない処理")の判断の仕方、つまり、ajaxの使いドコロがよく分かっていません。

以上3点につきまして、ご教授いただければ幸いです。

A 回答 (3件)

現在行っている実装をベースに回答させていただきます。



(1)もちろんyesです。
Ajaxリクエストであっても、基本的にセッションやクッキーの扱いは同じであり、通常通りの処理を行います。

(2)セッションの有効性チェックで強制リダイレクト、というのは通常の処理だと思います。
FuelPHPやASO.NET MVCでは、アクションの実行直前に必ず呼び出されるメソッド(フィルタ)がありますので、そちらで全部一括して処理します。

(3)Ajaxの利用は、方向性としては間違っていないです。
ただし、一口にAjaxといってもいくつか種類があり、
3-1・スキームをサーバサイドで自動生成するもの(基本JSを書かない)
3-2・ほとんど全部をjQuery等で処理する「ピュアAjax」
3-3・さらにAngularやKnockoutなど、javascriptフレームワークを使うもの。

この中の3-2の場合、javascriptによるインベントハンドラ定義・サーバ送信データのHTMLへの反映、入力値のajax形式送信、という問題をすべてjavascriptで行うと、UI(ユーザインターフェース)にガチガチに拘束されたコードになって、開発効率(生産性)が悪化、バグ耐性も低下して、改変が非常に難しくなっています。

現在、サーバサイド開発は、IDEやMVCフレームワークの台頭で、かなり開発生産性や保守効率が上がっているのですが、Ajaxは開発環境も含めて困難度が高く、対応できるエンジニアも少ないことから、knockoutJSやAngularのようなフレームワークが正しく導入運用できるまで、「力攻めの」javascriptAjax DOM操作は封印です。
    • good
    • 0
この回答へのお礼

サーバーサイドではFuelPHPを使って開発をしていたので、(1)、(2)はピンポイントな回答で非常に助かりました。

(3)に関しましては、こういったjavascriptフレームワークが存在していること自体知らず、ご提案いただいた中の3-2の方法で実装を進めていました。

javascript内に、イベントハンドラの定義とイベントをバインドする要素を直接記述しなければならず、確かにおっしゃる通りJavascriptへの依存度の高く「あまり美しくないな」と思っていました。

とりあえずknockout.jsについて調べてみたのですが、一切javascript上でDOM操作をせずにHTMLの更新ができたり、HTMLと処理部分を上手く分離できるなど、一気に開発・保守の効率が高まりそうですね。

AngularJSについても調べてみようと思います。

期待していたよりもレベルの高いご回答をいただき、非常に勉強になりました。

本当にありがとうございます。

お礼日時:2013/06/03 00:34

個人的な考えです



1) AJAXのサーバー側チェック
基本的に「クライアントは絶対に信じるな」が合言葉ですので、
遷移だろうが非同期だろうが関係なく、
HTTPで受け付ける要求は全て厳格なチェックを行ってください。

2) AJAXのエラー処理
エラー用のJSONを返すもよろしいですが、
HTTP応答で 403 Forbidden を返し、AJAX のエラーイベントで処理するのも手です。

3) AJAXの使いどころ
セキュリティの点では何の問題もないと思います。
なので、業務目的と使い勝手で選択すべきかと思います。
・古い環境を考慮するなら、画面遷移のみ
・画面のごく一部だけ書き換えたいならAJAX
・画面入力状態を保持したままPOST送信したいならAJAX
・ただし業務的に重要な操作なら、入力・確認・完了と画面遷移
・表示系機能でブラウザの戻る(巻き戻す)機能を重視するなら画面遷移
・サーバー側処理が非常に重い業務ならAJAX
・再利用できる画面部品の処理ならAJAX
    • good
    • 0
この回答へのお礼

非常に有用なご回答をいただき、本当に有難うございます。

(1)
やはりそうですよね…。
自分でも「常識的に考えてチェックは必須だよなぁ」とは思っていたのですが、改めてご回答をいただき、自信をもつことが出来ました。

(2)
なるほど、レスポンスコードでエラーを表現するという手法は凄くよさそうですね。是非とも活用してみたいと思います。

(3)
これは非常に参考になります。
こういった「判断基準」に関する情報が全然なかったので、是非とも参考にさせて頂きます。

お礼日時:2013/06/02 23:35

1.そりゃもちろん。


直接そのAjax通信側のURLにアクセスされたらどうするの?

2.うん、それでいいと思うよ。

3.別に作り方、考え方次第。
非同期通信だろうが同期通信だろうが、セキュリティの考慮は何も変わらないと思うけど?
    • good
    • 0
この回答へのお礼

何分まだ開発経験が未熟なので、何が正解か分からず右往左往していまたが、ご回答を頂いていろいろと確信が持てました。

ありがとうございます。

お礼日時:2013/06/02 23:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!