«前の日記(2007-08-22 (水)) 最新 次の日記(2007-08-24 (金))»  

まちゅダイアリー


2007-08-23 (木)

非公開URLとワンタイムURLは違う

第26回 「非公開URL」によるアクセス・コントロールについて考える:ITproを読んだ。 Googleカレンダーで使われている「非公開URL」について書かれていて参考になったけど、ひとつだけ気になる点があった。

Googleカレンダーでは,標準ではカレンダーは「非公開」,つまり自分以外は内容を見られないように設定されます。しかし,この「非公開URL」にアクセスすると,特に認証が無くても,つまり誰でも,カレンダーの内容を閲覧できるようになっています。

このトークンの値は,「非公開URLをリセット」という機能を使うと,明示的に変更できます。

この手法はいわゆる「ワンタイムURL」と呼ばれる手法の一種です。ワンタイムURLは,何らかのデータを一時的にダウンロード可能にするために,一定期間だけ有効なURLを用意するとか,パスワードを忘れてしまったユーザーに,一定期間アクセス可能な「パスワード変更用ページ」を用意する,といった「一定時間だけアクセスを許可する」という時限付きURLに利用されるのが一般的です。

この後は「非公開URL」ではなく、「ワンタイムURL」という言葉で話が進んでいく。

ワンタイムURLを使った認証は,「URL」というたった一つの情報だけを使って,「それを知っているか,知らないか」だけでアクセス可能かどうかを決めます。したがってURLが漏洩してしまう危険性は常に存在します。URLというのはパスワードと比べてはるかに漏洩しやすいので,サービス提供側では,それを漏洩しないように注意しなければなりません。漏洩しやすい場所として考えられるのは,一つはリファラー,そしてもう一つは検索エンジンでしょう。

はてなブックマークでもこれをワンタイムURLの一種として話を進めるのは誤解を招くと思うというコメントがついているけど、確かに非公開URLをワンタイムURLと呼んでいるので話がちょっと分かりにくくなっている。

本当にワンタイムURLであれば、リファラーや検索エンジンによるURLの漏洩は気にする必要がない。 リファラーが残るということは、すでに正当なユーザがそのURLにアクセスしているということになる。 次に他の人がアクセスしても、そのURLはもう無効なので問題ないんじゃないかな*1。 ワンタイムURLで漏洩が問題になるのは、正当なユーザがアクセスする前に漏洩する場合だと思う。

箇条書きで整理してみる。

  • ワンタイムURLは非公開URLの一種だけど、すべての非公開URLがワンタイムURLではない。
  • ワンタイムURLであればリファラーによる漏洩は気にしなくていい。
  • Googleカレンダーの例はワンタイムURLではなく非公開URL(なのでリファラーによる漏洩には注意)。

ちょっと心配なのが、以下の2点。

  • 「ワンタイム」という言葉は「ワンタイムパスワード」のように安全な「印象」がある。ただの非公開URLをワンタイムURLと誤用することで、根拠のない安心感が広まっちゃうかも。
  • ワンタイムURLの正しい実装が理解されなくなるかも(ワンタイムURLを実装するという要件に対して、ただの非公開URLを実装するケースとか)。

記事を読む場合は、「ワンタイムURL」を「非公開URL」と置き換えて読んだほうがいいと思う。 タイトルも『「非公開URL」によるアクセス・コントロールについて考える』なんだから。

ちなみに

Googleカレンダーのヘルプには、以下のように書かれている。

"個人用 URL" について教えてください。

注: 個人用 URL はご自身のみがご利用になるアドレスですので、他のユーザーと共有しないでください。お使いのカレンダーを他のユーザーに公開する場合は、カレンダーの公開 URL (または [カレンダー URL]) を共有してください。

英語設定だと、「Private Address」になってるみたい。

What's a "Private Address"?

This is the private address for this calendar. Don't share this address with others unless you want them to see all the events on this calendar.

少人数であっても他人には教えるなってスタンスみたいだから、「非公開URL」よりも「個人用URL」のほうがいいかもね。

Tags: memo

*1 最初にアクセスしたユーザに対してセッションCookieを発行し、それ以外の接続を無効とするように実装されている前提