webアプリケーション開発向け...

24
Webアプリケーション開発向け AOP機構の実装 2009年3月18日 外村 慶二, 成瀬 龍人, 塩塚 大, 白石 卓也 , 鵜林 尚靖 (九工大) 中島 震 (NII) 1

Upload: others

Post on 23-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

Webアプリケーション開発向けAOP機構の実装

2009年3月18日外村 慶二, 成瀬 龍人, 塩塚 大, 白石 卓也 , 鵜林 尚靖 (九工大)

中島 震 (NII)

1

Page 2: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

発表概要

2

Webクライアント

WebクライアントWebサーバ

HTTPリクエスト/レスポンス

負荷分散アクセス制御

アプローチ:Webプロトコルに基づくAOP機構 (AOWPとAOWP/PHP)

問題意識:一連のHTTPリクエストに基づく横断的関心事を容易にモジュール化したい

APSEC 2008

本日の発表

テーマ:Webプロトコルに基づくAOP機構をどのように実装するか?

アプローチ:PHP向けAOP言語 + AOWPライブラリ

Page 3: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

発表手順

• AOWPとAOWP/PHP (ツールデモ有り)

• 実装

• 性能評価

• 関連研究

• まとめ

3

Page 4: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

AOWPとAOWP/PHP

4

Page 5: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

AOWPWebクライアント

WebクライアントWebサーバ

リクエスト/レスポンス

プログラム

プログラム

アスペクト (Aspect)

ポイントカット(Pointcut)

アドバイス(Advice)

•Webプロトコル上のイベントに基づくポイントカット- HTTPリクエストを選択- フォームデータの読み込みを選択- ページ遷移履歴に基づいて選択- 等々

•Webトランザクションに基づくアスペクトのインスタンス管理- Webアプリケーション全体- クライアント (セッション) ごと- リクエストごと- 等々

アスペクトインスタンス

アスペクトインスタンス

5

Page 6: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

AOWP/PHP

6

class アスペクト名 extends AOWP_Aspect {public function __construct() {// ポイントカットの定義// アドバイスの定義

}

// アドバイスとして実行するメソッドの定義public function advice1($context) {}

}

• PHPを対象にしたクラスベースAOPフレームワーク

• アスペクトをPHPのクラスとして定義

• ポイントカットとアドバイスをコンストラクタで定義

Page 7: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

AOWP/PHPの記述例

ユーザ認証

• 全てのページ遷移にユーザ認証に基づくアクセス制御を追加

• 同一のアスペクトをブログシステムとWikiシステムに織り込み

Webクライアントブログシステム

Webクライアント

ユーザ認証アスペクト

Wikiシステム

http://wordpress.org

http://pukiwiki.sourceforge.jp

7

Page 8: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

AOWP/PHPの記述例

ユーザ認証class AccessControllAspect extends AOWP_PerSessionAspect {

private $_loginName = null;public function __construct() {

$pointcut = new AOWP_RequestPointcut('.*');$advice = new AOWP_BeforeAdvice();$advice->setPointcut($pointcut);$advice->setAdviceBody('accessCheck');$this->addAdvice($advice);

}public function accessCheck(AOWP_Context $context) {

if ($this->_loginName === null) {if (AccessManager->checkUser($_POST['id'], $_POST['pass'])) {

$this->_loginName = $name;}else {

$toURL = $_SERVER['REQUEST_URI'];include 'login.php';exit();

} } }}

ユーザセッションごとにインスタンス化

全てのページ遷移イベントを選択

選択したイベントの前にユーザ認証処理を追加

8

Page 9: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

AOWP/PHPの記述例

ページ遷移履歴に基づくアクセス制御

• 一般利用者と教育関係者で異なる価格を設定

• 教育関係者向けのページを見る前に確認ページを必ず閲覧

• 検索結果等からの確認ページを閲覧していない利用者に対してアクセス制御

トップ

一般利用者向け

教育関係者向け

Notebook PC

Work station

Notebook PC

Work station

利用規約ページ

検索結果から

ブックマークから

http://www.oscommerce.com9

Page 10: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

class AccessControllAspect extends AOWP_PerJoinPointAspect {const CON_URL = '/catalog/conditions\.php';public function __construct() {

$allRequestPointcut = new AOWP_RequestPointcut(CON_URL);$allRequestPointcut->Not();$conditionPageHistory = new AOWP_PageHistoryPointcut();$conditionPageRequest = new AOWP_RequestPointcut(CON_URL);$conditionPageHistory->addRequest($conditionPageRequest);$conditionPageHistory->Not();$allRequestPointcut->addAnd($conditionPageHistory);$advice = new AOWP_BeforeAdvice();$advice->setPointcut($allRequestPointcut);$advice->setAdviceBody('forwardToCondition');$this->addAdvice($advice);

}public function forwardToCondition(AOWP_Context $context) {

header("Location: " . CON_URL);exit();

} }

AOWP/PHPの記述例

ページ遷移履歴に基づくアクセス制御

10

利用規約以外のページ遷移イベントを選択

利用規約のページ遷移イベントを履歴に含まないときの全てのイベントを選択

利用規約を閲覧していないときのページ遷移イベント

を選択

Page 11: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

実装

11

Page 12: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

実装方針

Webプロトコル上のイベント/コンテキストを取り扱うポイントカット

Webトランザクションに基づくアスペクトのインスタンス管理

汎用的なAOP機構

AOWPのコンセプト 実装

+

Webに特化したポイントカットライブラリ

Webに特化したアスペクトインスタンスの

ファクトリクラス汎用的なAOP言語を拡張

- Webで広く使われているPHPを対象に実装

12

Page 13: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

PHPを対象としたAOP機構•対象システムのPHPスクリプトをASTに変換し織り込み

•ウィーバ自体もPHPで実装 (PEARのPHP_ParserGeneratorを使用)

• PHPに基づくジョインポイント (それを選択するポイントカット)- スクリプトファイルの呼出/実行

(ScriptCall/Execution)- グローバルな配列変数 の書込/読込

(ArraySet/Get)- 関数呼出/実行 (FunctionCall/

Execution)- 等々

コード解析

織り込み

コード生成

PHPスクリプト

アスペクト

ASTインスタンス

織り込み済ASTインスタンス

13

Page 14: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

Web固有のイベントとジョインポイントのマッピング

<?php ... $_GET['a'] = 11; ... $_SESSION['id'] = 123; ... $_COOKIE['b'] = 'aaa'; ...?>

<?php ... $_GET['a'] = 11; ... $_SESSION['id'] = 123; ... $_COOKIE['b'] = 'aaa'; ...?>

<?php ... $password = $_GET['pass']; ... $userID = $_SESSION['user_id']; ... ... $_COOKIE['cache'] = 'bbb'; ...?>

PHPスクリプト

クライアント

Webサーバ

HTTPリクエスト セッションデータ

フォームデータ

クッキーデータ

• Webプロトコルに基づくイベントをPHPのソースコードに対応付け織り込み

14

Page 15: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

Webに特化したポイントカットライブラリ (一部)

AOWPポイントカット PHPにおける対応するポイントカット

Request ScriptExecution (URLと対応するスクリプト名)+ If (指定したHTTPリクエストに対応するか?)

GetRead ArrayGet (_GETのグローバル変数名)

SessionRead ArrayGet (_SESSIONのグローバル変数名)

SessionWrite ArraySet (_SESSIONのグローバル変数名)

PageHistory○ ページ遷移イベント (Requestが選択するイベント)の履歴を監視するアドバイスを生成○ If (ページ遷移履歴の監視結果の評価)

15

Page 16: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

Request ポイントカット

ユーザ認証の適用例 (Request(‘.*’))

• Request- リクエストURL- フォームデータ- HTTPリクエストのヘッダ

情報

•実現方法- リクエストURLと対応する

スクリプトファイルの実行 (ScriptExecution ポイントカット)

- フォームデータ, ヘッダ情報が指定したものを満たすか? (If ポイントカット)

- リクエストに対する最初のスクリプトファイル実行か? (If ポイントカット)

� � � � � �

� � � � � � � �

� � � � � � � � � �

� � � � リクエスト

� � � � リクエスト

� � � � リクエスト

� � サーバ

読み込み

ユーザ認証(Auth)

16

Page 17: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

Web固有のイベント履歴に基づくポイントカット

• PageHistory- 正規表現を用いて指定した

ページ遷移履歴の有無に基づいてイベントを選択

•実現方法- 指定したパターンに基づい

てページ遷移履歴を監視する処理の追加 (アドバイスの自動生成)

- HTTPリクエストに対する最初のスクリプトファイルの実行か? (If ポイントカット)

ページ遷移履歴に基づくアクセス制御の適用例

index.php

cart.php

condition.php

HTTPリクエスト

HTTPリクエスト

HTTPリクエスト

Webサーバ

アクセス制御(ConOfUse)

ページ遷移イベントの監視(498fe08bb2027_GeneratedAspect) 監視結果の取得

監視結果に基づいてアドバイスを実行

17

Page 18: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

アスペクトのインスタンス管理

インスタンス管理方法 PHPにおける実現方法

perapplicationWebアプリケーションで一つのインスタンスとなるように,シリアライゼーションを

用いたインスタンス管理

persessionクッキーデータを用いて保存したクライアントごとに一意なIDと関連づけて,シリアライゼーションを用いたインスタンス管理

perrequeststatic変数として管理

(PHPでは,リクエストごとにプロセスが立ち上がり処理を行う為)

ファクトリクラスを通してアスペクトをインスタンス化18

Page 19: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

性能評価

19

Page 20: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

織り込み時間

対象システム コード行数(スクリプトの数)

織り込み時間(最大メモリ使用量)

パースキャッシュ使用時の織り込み時間

PukiWiki 17925 行(107 個)

76.505 秒(19.31 MByte)

39.433 秒(18.931 MByte)

WordPress 81152 行(258 個)

344.030 秒(53.185 MByte)

173.773 秒(50.701 MByte)

ユーザ認証のアスペクトを織り込んだ場合→ 対象プロジェクトが大規模な時,織り込み時間が開発の負担になる

対象プロジェクトのパース結果等のキャッシュ,織り込みの最適化が必要20

Page 21: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

織り込み有無の実行速度(Request ポイントカットについて)

対象システムへの変更内容 トップページの表示時間(変更無しを基準とした割合)

変更無し 0.0413 秒(1 倍)

手作業でユーザ認証を追加 0.0410 秒(1 倍)

織り込みによりユーザ認証を追加 0.1534 秒(3.7 倍)

PukiWiki を対象に全ページにユーザ認証を適用した場合

→ 全てのスクリプトファイルの先頭にユーザ認証を織り込んでおり, トップページの表示までに 27回ユーザ認証の評価が実行されている為 ?

21

Page 22: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

織り込み有無の実行速度(Request ポイントカットについて)

対象システムへの変更内容 トップページの表示時間(変更無しを基準とした割合)

変更無し 0.0413 秒(1 倍)

織り込みによりユーザ認証を追加 0.1534 秒(3.7 倍)

織り込みによりユーザ認証を追加(織り込み位置を手作業で最適化)

0.1305 秒(3.2 倍)

織り込みによりユーザ認証を追加(AOWPのスクリプト読込みを手作業で最適化)

0.0481 秒(1.2 倍)

→ AOWPの実行の為のスクリプトの読み込みに時間がかかっている?AOWPのスクリプト読み込み と 織り込み位置 について部分最適化が必要

22

Page 23: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

関連研究• PHPを対象としたAOP言語- John Stamey and Bryan Saunders, Simon Blanchard; The

Aspect-Oriented Web, SIGDOC ’05- Sebastian Bergmann and Günter Kniesel; GAP: Generic

Aspects for PHP, Third European Workshop on Aspects in Software, 2006

➡ 本研究では,Webプロトコルに特化したAOP機構を提案した

• トレースベースAOP- Robert J. Walker and Kevin Viggers; Implementing

Protocols via Declarative Event Patterns, SIGSOFT '04/FSE-12

- Chris Allan, Pavel Avgustinov and et al.; Adding Trace Matching with Free Variables to AspectJ, OOPSLA ’05

➡ プログラムの実行履歴に基づくポイントカット.本研究のPageHistory ポイントカット等は,ページ遷移イベント等の特定の実行履歴のみを取り扱った.23

Page 24: Webアプリケーション開発向け AOP機構の実装posl.ait.kyushu-u.ac.jp/publications/slide/sigse200903-h... · 2020-02-26 · AOP機構の 実装 2009年3月18 ... パースキャッシュ

まとめ

•Webプロトコルに基づくAOP機構を, 汎用的なAOP言語のライブラリとして実現する手法を提案した

•今後の課題- モデルベースのAOP (言語非依存)- オートマトンを使ったWebアプリの検証- 動的織り込み

24