3/31(月)にDoCoMoからiモードIDの仕様が公開された(作ろうiモードコンテンツ:iモードセンタの各種情報)。この仕様は、一般サイトでも利用可能となった新たなユーザー識別子に関するものだ。
これまでDoCoMoの公式サイトでは、ユーザーに同意画面を表示することなく、ユーザーIDと呼ぶユーザー識別子を取得できた。公式サイトでしか利用できなかったユーザー識別子が、一般サイトでも利用できるようになった。iモードIDと呼ぶ、新たなユーザー識別子の登場だ。
iモードIDを導入するとこうなる
iモードIDを使用したサイトを構築するとしたら、どんな使い道があるのか?mixiを例にあげると分かりやすい。
DoCoMo端末でmixiにログインするには、メールアドレスとパスワードを入力するか、「かんたんログイン」ボタンを押す。「かんたんログイン」ボタンを押したときは、「機種情報を送信しますか?」といったダイアログが表示されるので、そこでYESを選択するとログインができる。だけど一度ログインした後で、再度ブックマークからmixiにアクセスしようとすると、また同じように「ログイン」を行わないといけない・・・。
ここでiモードIDの登場。もし仮にmixiがiモードIDに対応すれば、アクセスするたびにログインする必要がなくなる。mixiの会員にとっては、いったんログインすれば、その後ブックマークからアクセスしてもログイン状態を保持できるメリットがある。ログイン状態が保持できるから、mixiから「かんたんログイン」機能がなくなるかもしれない。
もちろんmixiがセキュリティ上の理由で、サイトに「ログイン」ボタンを残す可能性もある。しかし技術的には、ログインは最初のアクセス1回だけ、2回目以降はログイン不要、というサイト構成も可能だ。
iモードIDとは一体・・・
iモードIDの実体は、iモード端末からWebサーバーへのリクエストする際、iモードサーバーが追加するHTTPヘッダのこと。
iモード端末からWebブラウザでHTTPアクセスする際、DoCoMoのiモードサーバー経由でWebサーバーにアクセスする。iモードIDは、このiモードサーバーを通過するときにリクエストヘッダX-DCMGUIDとして追加される。このヘッダは必ず追加されるわけではなく、リクエストURIのクエリーにguid=ONが含まれていた場合にのみ追加される。これがiモードIDだ。
iモードIDは7桁の英数字。iモードIDはFOMAカードに対して1対1に対応したIDだから、これを利用してユーザー識別を行い、ユーザーごとにサイト表示を切り替えたりといったことが可能となるのだ。このiモードIDはFOMAだけではなく、movaでも使える。
ところで、クエリーパラメータ名がguidとなっている通り、iモードIDはGUID(Global Unique IDentifier:グローバルな範囲で一意なID)のようだ。GUIDと言うからには、一人に1つのGUIDを割り当る。そして一度割り当てたIDは永久に他の用途には使用できない。iモードIDの桁数が7桁しかないけど、桁数は少なすぎないか?大文字小文字と数字の組み合わせが62通りだから、iモードID7桁の組み合わせは62の7乗=3兆5000億通り。DoCoMo契約者数が5000万人、世界の人口が66億人であることを考えると、まあ当分は大丈夫そう。
あと、制限事項としてはSSLではiモードIDが追加できない点がある。SSLは仕様上、通信経路上で通信内容を傍受したり書き換えたりすることができない。iモード携帯でも同じことがいえる。つまり携帯とWebサーバーとの間に存在しているiモードサーバーは、リクエストURIを判別することもできない。さらにリクエストヘッダを追加するなどHTTPリクエストを改変するようなこともできない。
他の特徴としては、携帯の利用者はiモードIDをWebサーバーに送信するかどうかを自分で設定できる。デフォルトでは、iモードIDを送信する設定になっているようだけど、変更したい場合はiモードメニューで設定変更できる。ユーザー識別子の送信可否を選択できるのは、auのサブスクライバIDやSoftBankのユーザーIDと同じ仕様だ。
これまでとの違い
iモードID発表以前はどうだったのか?これまでWebサーバー側でDoCoMo端末のユーザー識別子を取得するには、以下の2つの方法があった。
- ユーザーID
- クエリーパラメータからユーザー識別子を取得する方法。
- utn
- リクエストヘッダUser-Agentから端末の製造番号やFOMAカード番号を取得する方法。
ところがサーバー側でユーザーIDが取得できるのは、iモードメニューに掲載された公式サイトのみ。iモードメニューに掲載されない一般サイトでは使用できないという短所があった。
一方、utn(unique terminal numberの略か?)は一般サイトでも取得できる。ただ、端末からutnを送信する度に、端末の画面に「製造番号を送信しますか?」というダイアログが表示されてしまう。このダイアログを表示せずに端末からutnを送信することはできない。これではutnを利用するページにアクセスするたびに、この確認ダイアログが表示されるというサイトにせざるをえない・・・。さらに、ブックマークしたURLからはutnが送信できない制限もある。これではユーザビリティとしては最悪だ。
他の方法として、PCサイトで非常によく使われている方法がある。ログインしたタイミングで、ユーザー識別子をブラウザのCookieに設定する方法だ。しかし、DoCoMoでは相変わらずCookieが使えないから、結局この手も使えない。これがiモードID発表以前の状態だった。
iモードIDは一般サイトでもユーザー識別子を取得でき、しかも確認ダイアログも表示されない画期的なものだ。以下に違いをまとめてみた。iモードIDには○が多いことが分かる。
| 方法 | iモードID | ユーザーID | utn |
|---|---|---|---|
| 識別子の出現箇所 | X-DCMGUIDヘッダ | クエリーパラメータ (名前は非公開)*1 | User-Agentヘッダ |
| 識別子の長さ | 英数字7桁 | 英数字12桁 | 製造番号11桁 FOMAカード番号20桁 |
| 一般サイト使用可否 | ○ | × | ○ |
| HTTPでの取得 | ○ | ○ | ○ |
| SSLでの取得 | × | × | ○ |
| mova対応 | ○ (多分全機種対応) | ○ | △ (非対応機種あり) |
| FOMA対応 | ○ | ○ | ○ |
| ユーザー側での送信拒否 | ○ | × | ○ |
| ブックマークURLからの 識別子送信 | ○ | ○ | × |
| ダイアログなしでの 識別子送信 | ○ | ○ | × |
| HTML記述 | <a href="xxxx?guid=ON"> | (非公開)*1 | <a href="xxxx" utn> |
公式サイトでは課金処理の関係でユーザーIDを使用しているけど、今後はユーザーIDとiモードIDを併用していく場合もあるかもしれない。
- *1:DoCoMoのConfidential情報のため非公開とします。
iモードIDの取得
iモードIDはDoCoMoのiモードサーバーがリクエストヘッダに追加する。なのでWebサーバー側では、リクエストヘッダX-DCMGUIDからiモードIDが取得できる。
iモードサーバーがiモードIDをヘッダに追加するための条件は、リクエストURIのクエリー文字列にguid=ONが含まれていること。つまり、http://symple.jp/?guid=ON のようなURLにアクセスすると、iモードIDがWebサーバー側に送信される。
HTMLで言えば、リンクURLに?guid=ON を付けておく。formの場合、GETならinputタグで指定し、POSTならaction属性に?guid=ONを指定する。
<a href="xxx.html?guid=ON">リンク先</a> <form action="xxx.html" method="GET"> <input type="hidden" name="guid" value="ON" /> : </form> <form action="xxx.html?guid=ON" method="POST"> : </form>
実際にiモードIDを取得してみた
簡単なJSPページを作って実機でアクセスしてみた。JSPページのソースは以下の通り。
<%@ page contentType="text/html; charset=Shift_JIS" %>
<html><body>
<h1>iモードIDテストページ</h1>
<br>
■メソッド<br>
<%= request.getMethod() %><br>
■リクエストURI<br>
<%= request.getRequestURI() + (request.getQueryString() == null ?
"" : "?" + request.getQueryString()) %><br>
■X-DCMGUID<br>
<%= request.getHeader("X-DCMGUID") == null ?
"(なし)" : request.getHeader("X-DCMGUID") %><br>
<hr>
<h2>リンク</h2>
<a href="imodeid.jsp">更新(パラメータなし)</a><br>
<a href="imodeid.jsp?guid=ON">更新(guid=ON)</a><br>
<a href="imodeid.jsp?guid=hoge">更新(guid=hoge)</a><br>
<hr>
<h2>フォーム(GET)</h2>
<form action="imodeid.jsp" method="GET">
<input type="submit" value="GETで更新(パラメータなし)">
</form>
<form action="imodeid.jsp" method="GET">
<input type="hidden" name="guid" value="ON">
<input type="submit" value="GETで更新(guid=ON)">
</form>
<hr>
<h2>フォーム(POST)</h2>
<form action="imodeid.jsp" method="POST">
<input type="submit" value="POSTで更新(パラメータなし)">
</form>
<form action="imodeid.jsp" method="POST">
<input type="hidden" name="guid" value="ON">
<input type="submit" value="POSTで更新(POSTデータにguid=ON)">
</form>
<form action="imodeid.jsp?guid=ON" method="POST">
<input type="submit" value="POSTで更新(URLにguid=ON)">
</form>
<hr>
</body></html>
実機でアクセスすると、確かにリクエストヘッダX-DCMGUIDからiモードIDが取れていた。formのGETやPOSTで取得できることも確認。
FOMAカードを差し替えて他の機種でアクセスすると、同じiモードIDが表示された。FOMA番号が同じなら、iモードIDも同じになることが分かる。
movaでもiモードIDが取得できた。
まとめ
これでようやく3キャリアとも、一般サイトでユーザーIDが取れるようになった(SoftBank C型は除く)。サイト製作の幅が広がるから、これはコンテンツプロバイダにとっては喜ばしいこと。
とはいっても、すべてのリンクに?guid=ONをつけないといけないのは面倒。あとはこれが解決される日を待つだけ?






















この記事にはまだコメントがついていません。
■ コメントをどうぞ