N〇K Oneの仕上がりが悪すぎる
関連記事
10月から始まったN〇Kの新ネットサービス
日本の公共放送でもあるN〇K。
既に、「ニュース・防災」「プラス」のサービスは開始されていた。
そして「これらのサービスを一本化する」として、盛んに宣伝されていた「N〇K ONE」の提供が開始。
しかし、これははっきり言って「以前と何が変わったのだろう」「かえって利便性を損なっているだけではないか」
と思えるほど、ひどい仕上がりだ。
仮に民間企業であれば、こんなものを世に出せるだろうか?
初日の不具合
10月1日の午前0時から一斉に、以前のアプリが使えなくなる。
これはサービスサーバーのIPアドレスを変更したのであろう。
「新しいアプリをダウンロードしてくれ」というリンクに従い、新しいアプリをインストール。
そしてそのあと、アカウントを登録しようとしたところ「確認コード」が送られてこない不具合(現在は解消とのこと)。
原因はgmailなどに多量のメールが送信されたため、それをスパムと誤認されたからだという。
SMSやその他の手段で確認コードが送信できなかったのだろうか?
メールに限った理由は、何か?
セッションが切れる
ようやくログインに成功。認証サーバはCloudflareのサーバーを使用しているようだ。
プロファイルを作成。
ログインには成功した。
しかし、ONEのアプリを終了すると、また再度ログインの画面が表示される。
普通、一度認証が成功すれば、普通は認証情報をアプリの中とサーバー側に持っているのではないだろうか?
しかし、アプリを終了すると認証情報が消えるということは、これはステートレスなのか。
このようなアプリは、いままで見たことがない。
Android版アプリの不具合
知人のAndroid(ver.14)では、N〇K ONEのニュース・防災アプリはインストールできるものの、起動しない。
プラスのほうは大丈夫なようだ。
iOSのものは問題ない(ようにみえる)。
数えきれないほどの問題
そもそも、N〇K ONEという触れ込みだったので、アプリを一本化するのだと思っていた。
しかし、アプリは2種類のまま、ただ外側のアプリを入れ替えただけで、コンテンツは変わらない。
変わったところは「認証」の部分だけだ。
しかもその部分が、期待されたように動作していないように見える。
これだったら、以前のアプリの方がずっとましだったというものだ。
OAuthを導入したほうがましだったかもしれない。
毎回、メールアドレスとパスワードをサーバーに送信して、プロファイルを選ばなければログインできないなんて。
メールアドレスとパスワードの組は、毎回、ネットに流れていることは確かなのだ。
結論:未完成のアプリは普通リリースしないだろう
ふつうリリースの前には何回も厳しいコードレビューを受け、厳密なテスト(単体テスト、負荷テストなど)を受けるであろう。
しかし、これらのアプリは、本当にその工程を経ているのか、疑いたくなるような品質だ。
それが許されるのが、お役所なんだろうか?
だとすれば、問題が大きすぎる、と言わざるをえないだろう。
追記
一般的なセッション管理の仕組み
iPhoneアプリでは、主に以下のような方法でセッション管理が行われています。
1. トークンベース認証
- ログイン時にサーバーから アクセストークンを発行
- このトークンをアプリ内に保存(Keychainなど)
- API通信時にトークンを送信して認証
2. デバイス識別
- デバイス固有のID(IDFV等)をサーバーに登録
- サーバー側で「どのデバイスが有効か」を管理
- 同時利用可能台数を制限
NHK+アプリで起きた「同時視聴上限」エラー
発生メカニズム
旧端末: セッション A(有効)
新端末: データ移行 → セッション A をコピー
↓ 両方が同じセッション情報を持つ
新端末でアプリ起動
↓
サーバー「セッション A が複数デバイスから使われている!」
↓
エラー表示: 同時視聴上限を超えた
↓ 再ログイン
新端末: セッション B を新規発行
旧端末のセッション A は無効化
↓
正常に利用可能
なぜこうなるのか
-
データ移行で認証情報もコピーされる
- iCloudバックアップやクイックスタートで、Keychainの認証トークンも移行される
-
サーバーが同一セッションの複数利用を検知
- 同じトークンが異なるデバイスIDから使われることを検知
-
再ログインで新しいセッションが作成
- 新端末用の新しいトークンが発行され、旧端末のセッションは無効化
頻繁にログイン画面が表示される問題
Cloudflare経由の認証で起こりやすい問題
NHK+アプリはCloudflareを経由して認証を行っているため、以下の特有の問題が発生します。
1. Cloudflare Access/Turnstileによるセッション検証
- Cloudflare側で 短いセッションタイムアウトが設定されている可能性
- Bot対策(Turnstile等)で、アプリのバックグラウンド復帰時に再検証が必要
- Cloudflareのセッションとアプリ側のセッションが 二重管理されている
2. トークンの保存場所による違い
| 保存場所 | 永続性 |
|---|---|
| Keychain | 永続的(アプリ削除まで保持) |
| UserDefaults | アプリ終了で消える可能性あり |
| メモリ上のみ | アプリ終了で必ず消える |
NHK+アプリのケース:
- アクセストークンは保存されているが、Cloudflareのセッションクッキーが短命
- アプリ再起動時にCloudflareの認証チェックが走り、セッション切れと判定
3. Cloudflare特有の挙動
[アプリ] → [Cloudflare] → [NHK+サーバー]
↑
ここでセッション管理
Cloudflareが以下を行っている可能性:
- 短時間でのセッションタイムアウト(セキュリティ重視の設定)
- IPアドレス変更の検知(モバイル回線⇔Wi-Fi切り替え時)
- デバイスフィンガープリント検証の失敗
症状別の原因
| 症状 | 考えられる原因 |
|---|---|
| アプリ終了後に再ログイン要求 | Cloudflareセッションがメモリ上のみで管理されている |
| 数時間放置で再ログイン | Cloudflareのセッションタイムアウトが短い(例:1時間) |
| ネットワーク切り替え後 | IPアドレス変更でCloudflareが新規セッションと判断 |
| 不定期に発生 | Cloudflareのセキュリティチャレンジ |
なぜ再ログインが必要になるのか
Cloudflareを経由する認証フローでは:
- アプリ側のトークンは有効でも
- Cloudflare側のセッションが切れると
- APIリクエストがCloudflareで弾かれる
- アプリは「認証エラー」と判断して再ログインを要求
これは、Cloudflareがアプリとサーバーの間に入って 追加のセキュリティ層を提供しているためです。
開発者向けの対策
アプリ開発でこのような問題を防ぐための対策:
- デバイスバインディング: トークンとデバイスIDを紐付ける
- リフレッシュトークン: 定期的にトークンを更新
- セッション管理API: 有効なデバイス一覧を確認・無効化できる機能
- 自動セッション移行: 新デバイス検知時に自動的に旧セッションを無効化
- Cloudflareセッションの永続化: より長いタイムアウト設定や適切な保存方法の実装
ユーザーとしての対処法
残念ながら、これはNHK+アプリ側の実装とCloudflareの設定によるものです:
- 根本的な解決は難しい - サーバー側の設定変更が必要
- セッション設定の緩和はサービス提供者側の判断
- 頻繁な再ログインは、セキュリティ重視の設計トレードオフ
軽減策
- アプリを常時バックグラウンドに残しておく(完全には防げない)
- 安定したネットワーク環境で使用する(Wi-Fi推奨)
- アプリの最新版を使用する(改善されている可能性)
まとめ
NHK+アプリの挙動は、以下の2つの要因による正常な動作です:
- 端末移行時のエラー: セッションの複数デバイス利用を検知するセキュリティ機能
- 頻繁なログイン要求: Cloudflareによる追加のセキュリティ層とセッション管理
どちらもセキュリティとライセンス管理を重視した設計の結果であり、ユーザー側で完全に回避することは困難です。
Discussion