Works

Nobo Page

ログインなしですぐ使える、一時的な共有ページ作成アプリ。手軽さとセキュリティ設計の両立を検討しています。

ステータス
prototype
カテゴリ
app
スタック
TypeScript, Web Security, Capability URL

主なハイライト

  • アカウント登録なしで即座に使える設計
  • 閲覧・編集・管理を分けた権限モデルの検討
  • 保存期間の限定など、性質に合わせた安全設計

概要

Nobo Pageは、ログインなしで一時的な共有ページ(ボード)を作成できるアプリです。イベント当日の案内、短期間だけ使う共有メモ、QRコードから開く情報ページなど、長く使い続けることを前提としない用途を想定しています。手軽さを保ちながら、ログインが担っていた本人確認や権限管理をどう置き換えるかを設計の中心テーマにしています。

背景・経緯

ログインなしのアプリは利用開始までの負担が小さい一方、「認証がない」わけではなく、セッションやトークン、共有URLなど別の仕組みで権限を判断する必要があります。手軽さだけを優先すると、共有リンクの漏洩や権限の過剰付与といったリスクが見えにくくなります。Nobo Pageでは、ログインをなくす代わりに必要になる仕組みを曖昧にしないことを設計の出発点にしています。

解決した課題

ユーザーの課題

アカウントを作るほどではないが、すぐに作って人に渡したい情報を、登録の手間なく共有できるようにすること。同時に、機密情報の保存には向かないことを利用者へ正直に伝えること。

技術的な課題

アカウントに頼らずに「この操作を許可してよいか」を判断する仕組みを設計すること。共有する場合は閲覧・編集・管理の権限を分け、トークンを安全に扱う必要があります。

運用・その他の課題

ログインがないため、管理リンクを紛失した利用者の本人確認ができません。復元を前提にしない運用と、保存期間の限定によって責任範囲を小さく保つこと。

主な機能

  • ログインなしのページ作成 : 登録不要で即座に共有ページを作成
  • 権限を分けた共有 : 閲覧・編集・管理リンクの分離を検討
  • 保存期間の限定 : 一時利用を前提とした自動削除設計
  • 安全なユーザー入力表示 : XSSを防ぐ入力の取り扱い

担当・役割

  • 企画・コンセプト設計
  • セキュリティ設計
  • UI/UX設計
  • 実装

技術スタック

Frontend

  • TypeScript

Database / Auth

  • Session / Cookie
  • Capability URL (token-based access)

システム構成

共有しないsession-onlyな利用では、作成時のセッションからのみデータを取得できる単純な構成にできます。共有する場合は、ランダムなトークンを含む権限URL(Capability URL)を発行し、サーバーにはトークンのハッシュ値だけを保存して権限を判定する構成を検討しています。

Create page (no login)
 ↓
Session-only use → readable only from the creating session
 ↓
Share → issue capability URLs (view / edit / admin)
 ↓
Server stores token HASH only
 ↓
Limited retention → auto-delete

技術的なこだわり

ログインなしは「認証がない」ではないという前提

アカウント認証を、セッション・Cookie・共有URLといった別の仕組みに置き換えていると捉え、何を根拠に操作を許可するかを明確にしています。

閲覧・編集・管理の権限分離

一つのリンクに全権限を持たせず、用途に応じて閲覧・編集・管理を分けることで、リンク漏洩時の被害を小さく抑える設計を検討しています。

生のトークンをDBに保存しない

共有URLのトークンはパスワードに近い役割を持つため、サーバーにはハッシュ値だけを保存し、アクセス時に同じ方法でハッシュ化して照合します。

URLフラグメントの活用と限界の理解

トークンをURLフラグメントに入れることでサーバーログへの残留は避けやすくなりますが、JSから読めるためXSS等では漏れる点も前提にしています。

UI/UX・デザインの工夫

  • 登録なしで迷わず使い始められるシンプルな導線
  • 共有リンクの性質(リンクを知っている人はアクセスできる)を分かりやすく伝える表現
  • 機密情報の保存には向かないことを明示するUI

パフォーマンス・SEO・アクセシビリティ

  • ボードの閲覧・編集画面では外部スクリプトをできる限り置かない方針
  • 紹介ページとユーザーデータを扱う画面で求める安全性を分けて設計

セキュリティ・プライバシー

  • 閲覧・編集・管理権限を分離し、必要以上に広い権限を渡さない
  • 十分に推測困難なトークンを発行し、生のトークンをDBへ保存しない
  • ユーザー入力をHTMLとして直接描画せず、XSSによる権限漏洩や不正操作を防ぐ
  • HttpOnly CookieやCSPを活用しつつ、それだけでXSSを防げない前提で設計する
  • 保存期間を限定し、古い共有リンクが残り続けるのを防ぐ
  • 復元を前提にせず、機密情報向けではないことを利用者へ明確に伝える

苦労した点・改善した点

課題

ログインなしで「誰に操作を許可するか」をどう判断するか

解決策

セッションや共有トークンを権限の根拠とし、用途に応じて権限を分離

結果

アカウントに頼らずに操作許可を判断できる設計方針を整理

課題

共有リンク漏洩時の被害をどう抑えるか

解決策

閲覧・編集・管理リンクの分離と、トークンのハッシュ保存・保存期間の限定

結果

漏洩時の影響範囲を限定し、リスクを前提にした共有設計を明確化

学び

  • ログインをなくしても認証はなくならず、別の仕組みに置き換わるだけだということ
  • 共有機能があるとXSSの影響範囲が大きく広がること
  • 手軽さとセキュリティは、性質に合わせた制約を設けることで両立できること

今後の展望

  • 共有時の権限分離とトークン失効の仕組みの具体化
  • 保存期間や容量に関するポリシーの設計
  • ユーザー入力の安全な表示方法の実装と検証