アプリケーションにおける時計同期 — 本質、プロトコル、実装

著者: IT Sectr 公開日: 2026-07-14 読了時間: 9 分

Clock Sync(時計同期)は、デバイスの内部時計を基準時刻ソースに合わせるプロセスです。モバイルアプリケーションでは、プッシュ通知、SSL/TLS証明書、暗号化プロトコル、および分析の正しい動作のために、正確な同期が重要です。Google Security Blog(2024)によると、モバイルデバイスでのHTTPS接続障害の30%以上は、5秒を超えるシステム時刻の非同期が原因です。

要点

  • Clock Sync — NTP、SNTP、またはGPSプロトコルを介したデバイス時刻の基準UTCへの合わせ込み
  • 重要度 — 5秒を超える非同期はSSL、プッシュ通知、OAuthトークン、およびログを混乱させる
  • 主要プロトコル — NTP(精度1–50 ms)およびSNTP(簡易版、10–100 ms)
  • Android同期 — 組み込みのGoogle Time Service(GTS)がSNTPを介してGoogleサーバーと同期
  • プログラムによる補正 — アプリケーションでは、デバイスのシステム時刻に頼るのではなく、サーバーと時刻を比較することが重要

時計同期とは?

時計同期(Clock Sync)は、デバイスの内部時計を基準UTC時刻(協定世界時)に合わせるメカニズムです。同期がないと、モバイルデバイスの水晶発振器は徐々にずれていきます。温度と部品の品質に応じて、1日あたり1~10秒のずれが生じます。同期は、インターネット上のNTPサーバー、GPS衛星、または携帯電話基地局などの外部ソースから正確な時刻を取得することで、このずれを補正します。理想的には、デバイスは1秒以内の精度を維持するために4~6時間ごとに同期する必要があります。

ハードウェア時計とソフトウェア時計

モバイルデバイスには2種類の時計があります。ハードウェア(RTC、リアルタイムクロック)は別のバッテリーバックアップを持ち、デバイスの電源がオフでも動作し続けます。ソフトウェア(システム時刻)はオペレーティングシステムによって管理されます。起動時に、システム時刻はRTCから初期化され、その後クロックジェネレーターの割り込みによって維持されます。NTP同期はシステム時刻を修正し、場合によってはRTCにも補正を書き込みます。Androidでは、ハードウェアRTCへのアクセスは制限されており、アプリはrootアクセスなしでは変更できません。

モバイルアプリで時刻同期が必要な理由

モバイルアプリケーションの動作の多くの側面は、正確なシステム時刻に大きく依存しています。SSL証明書には有効期間があります。デバイスの時刻が証明書の発行日より前または有効期限より後に設定されている場合、HTTPS接続はブロックされます。OAuthトークンとJWT認証は、有効期限を確認するためにタイムスタンプを使用します。非同期は誤った認証失敗につながります。プッシュ通知は時刻によってスケジュールされ、時計がずれると、ユーザーは間違った時刻に通知を受信するか、まったく受信しなくなります。

非同期の結果

アプリケーションのセキュリティも、誤った時刻によって影響を受けます。時刻ベースの暗号化(時間ベースOTP)、誤ったタイムスタンプのイベントログ、サーバー側の誤ったレート制限(サーバーが「未来の」リクエストをブロック)などです。OWASP Mobile Top 10(2024)によると、システム時刻の不信頼は、プラットフォームのセキュリティ不足のカテゴリーに分類されます。開発者は、クライアントの時計だけに頼るのではなく、常にサーバーで時刻を確認することを推奨します。差異がしきい値(5秒が推奨)を超える場合、アプリケーションは同期が行われるまで重要な操作をブロックする必要があります。

シナリオ非同期の影響
HTTPS/TLS証明書が期限切れまたは無効と見なされる
OAuth 2.0 / JWTトークンが期限切れとして拒否される
プッシュ通知通知が間違った時刻に届く
分析誤ったタイムスタンプのイベントがレポートを歪める
暗号化時間ベースOTPがサーバーと一致しない
レート制限サーバーが「未来の」時刻のリクエストをブロック

同期プロトコル:NTPとSNTP

時刻同期の主要プロトコルはNTPとその簡略版SNTPです。NTP(RFC 5905)は、サーバーフィルタリング、ドリフト分析、PLL補正を備えた完全なプロトコルです。サーバーやネットワーク機器で使用されます。SNTP(RFC 4330)は、継続的な同期を必要としないクライアントデバイス向けの軽量バージョンです。SNTPクライアントはリクエストを送信し、応答を受信し、履歴分析なしで時刻を設定します。モバイルデバイスでは、特にSNTPが使用されます。Androidの組み込みGoogle Time Service(GTS)は、time.google.comサーバーとSNTPを介して同期します。

追加の同期方法

NTP/SNTP以外にも、モバイルデバイスでの時刻同期はGPS受信機(理想的な条件で最大10 nsの精度)およびセルラーネットワーク(NITZ — ネットワーク識別情報とタイムゾーンを介して)でも可能です。GPSは最大の精度を提供しますが、屋外でのみ動作し、多くの電力を消費します。NITZはネットワーク登録時に携帯電話事業者によって自動的に提供されますが、すべての事業者がサポートしているわけではありません。Androidはすべての方法を組み合わせて使用します。優先的にGTS(SNTP)、バックアップとしてNITZ、高精度が必要なアプリケーションにはGPSを使用します。

分散システムにおける同期の問題

サーバーとクライアントが異なるデバイスにある分散システムでは、時刻同期は根本的な制限に直面します。ネットワーク遅延により、クライアントの正確な時刻を一意に決定することは不可能です。パケットが200 msかかった場合、リクエスト時と応答時のサーバーの時刻はすでに異なっています。NTPはRTT測定と統計処理によってこの問題を解決しますが、分散トランザクション(銀行振込など)には不十分であり、論理時計(ランポートタイムスタンプ)やベクタークロックが使用されます。

物理時計と論理時計

物理時計(ウォールクロック)は、NTPを介して同期される実際のUTC時刻です。論理時計は、システム内のイベントの順序番号であり、物理的な時刻に結びつきません。分散システムでは、イベントの順序付けにベクタークロックがよく使用されます。各ノードは、すべてのクラスターノードのカウンターベクターを保存します。モバイルアプリケーションでは、1~5秒の精度の物理同期で十分です。これにより、OAuth、SSL、プッシュ通知の正しい動作が保証されます。厳密なイベント順序付けが必要な場合(リアルタイムチャットなど)、サーバーレベルで論理同期が追加されます。

AndroidでのClock Syncの実装

Androidアプリケーションでの時刻同期の実装は、いくつかの方法で行えます。最も簡単なのは、REST APIを介してサーバー時刻を取得する方法です。サーバーは、応答本文またはHTTP DateヘッダーにUnixタイムスタンプを返します。このアプローチは追加のライブラリを必要とせず、時刻がサーバーと一致することを保証します。2つ目の方法は、SNTPクライアントを使用してNTPサーバーに直接問い合わせることです。3つ目は、デバイスがインターネットに接続されている場合にシステム時刻を自動的に同期するAndroidのGoogle Time Serviceに依存することです。

Androidのアプローチの比較

認証と金融取引を含むAndroidアプリケーションでは、組み合わせアプローチが推奨されます。APIリクエストごとに、サーバー時刻とSystem.currentTimeMillis()の差が保存されます。この差は、システムクロックが同期されているかどうかに関係なく、クライアントのすべての時刻計算に適用されます。このアプローチはクロックスキュー補正と呼ばれ、サーバーとの最後の既知の差を保存するクラスを通じて実装されます。さらに、WorkManagerを介して4~6時間ごとにバックグラウンドNTP同期を実行できます。

kotlin
// クロックスキュー補正
class ClockSyncManager {
    private var serverTimeDiff: Long = 0 // serverTime - deviceTime (ms)

    fun updateServerTime(serverTimestampMs: Long) {
        serverTimeDiff = serverTimestampMs - System.currentTimeMillis()
    }

    fun getCorrectedTime(): Long {
        return System.currentTimeMillis() + serverTimeDiff
    }

    fun isSyncValid(maxDiffMs: Long = 5000): Boolean {
        return Math.abs(serverTimeDiff) < maxDiffMs
    }
}

WorkManagerによるバックグラウンド同期

Androidで定期的なバックグラウンド時刻同期を行うには、PeriodicWorkRequestを使用してWorkManagerを使用します。同期タスクはSNTPリクエストまたはREST API呼び出しを実行し、サーバー時刻を取得してClockSyncManagerを更新します。PeriodicWorkRequestの最小間隔は15分ですが、時刻同期には4~6時間で十分です。同期時にはネットワーク状態を考慮し、ローミング中の不要なリクエストを防ぐためにNetworkType.CONNECTEDを使用します。同期が失敗した場合は、以前の補正を保存します。これは徐々に精度が低下しますが、有効なままです。

デバイスでの自動時刻同期

現代のモバイルデバイスは、組み込みサービスを介して自動的に時刻を同期します。AndroidではGoogle Time Service(GTS)(Google Play Servicesの一部)です。iOSでは、オペレーティングシステムに組み込まれたNTPクライアントです。これらのサービスはアプリケーションとは独立して動作し、追加の設定は必要ありません。ユーザーは設定で自動同期を無効にでき、アプリケーションにリスクをもたらします。この場合こそ、開発者が独自の同期を実装する必要があります。Settings.Global.getInt(AUTO_TIME)を介して自動同期ステータスを確認し、無効になっている場合はユーザーに警告することをお勧めします。

プラットフォーム同期サービスプロトコル
AndroidGoogle Time Service(GTS)SNTP
iOS組み込みNTPクライアントNTP
セルラーネットワークNITZ(キャリア)NITZ
GPS受信機衛星信号GPS Atomic Time

開発者向け推奨事項

自動同期だけに依存するのは危険です。ユーザーが無効にしたり、インターネットのないエリアにいる可能性があります。ベストプラクティスは、APIリクエストごとにサーバーから時刻を取得し、SharedPreferencesまたはDataStoreに非同期を保存することです。重要な操作(支払い、認証、文書署名)の場合は、実行前に必ずisSyncValid()を確認してください。非同期がしきい値を超えた場合は、自動同期を有効にするか同期を待つことを提案する画面をユーザーに表示します。ゲームやエンターテイメントアプリの場合は、起動時にサーバーから時刻を取得し、1時間に1回更新するだけで十分です。

よくある質問

時計同期とは何ですか?また、どのように動作しますか?

時計同期は、デバイスのシステム時刻を基準UTCに合わせるプロセスです。NTPまたはSNTPプロトコルを介して動作します。デバイスがサーバーにリクエストを送信し、ネットワーク遅延を測定し、時計の補正を計算します。結果は、ネットワークに応じて1~100 msの誤差で正確な時刻です。

モバイルアプリで時刻を同期する必要があるのはなぜですか?

同期がないと、障害が発生する可能性があります。SSL証明書がHTTPSをブロックし、OAuthトークンが期限切れと見なされ、プッシュ通知が間違った時刻に届き、分析が誤ったタイムスタンプを記録します。重要な操作(支払い、認証)では、5秒を超える非同期はセキュリティ上の脅威と見なされ、操作をブロックする必要があります。

同期にはどのようなプロトコルが使用されますか?

主要なものはNTP(精度1~50 ms、フィルタリングとPLL付き)とSNTP(10~100 ms、簡略版)です。さらに、GPS(10 ns、ただし屋外のみ)とNITZ(携帯電話事業者経由、精度約1秒)があります。AndroidはSNTP上のGoogle Time Serviceを使用し、iOSは組み込みのNTPクライアントを使用します。

AndroidでNTPを介して時刻を同期するには?

time.google.comまたはpool.ntp.orgへの直接SNTPクエリには、Apache Commons Netライブラリ(NTPUDPClientクラス)を使用します。別の方法として、APIのHTTP応答ヘッダーからサーバー時刻を取得することもできます。継続的な補正のために、サーバー時刻とローカル時刻の差を保存するClockSyncManagerを実装します。

デバイスの時刻がサーバーと異なる場合はどうすればよいですか?

クロックスキュー補正を実装します。APIリクエストごとに、サーバー時刻とSystem.currentTimeMillis()の差を保存します。この差をアプリケーションのすべての操作で時刻補正に使用します。差が5秒を超える場合は、重要なトランザクションをブロックし、ユーザーに設定で自動同期を有効にするよう提案します。

まとめ

  • Clock Sync — NTP、SNTP、GPS、またはセルラーネットワークを介してシステムクロックを基準UTC時刻に合わせるプロセス
  • 重要度 — 5秒を超える非同期はSSL/TLS、OAuth、プッシュ通知、分析、暗号化を混乱させる
  • 主要プロトコル — NTP(PLL補正とフィルタリング付き、精度1~50 ms)とSNTP(簡略版、精度10~100 ms)
  • Android実装 — Google Time Serviceによる組み込み、Apache Commons NetまたはREST APIによるプログラム実装、WorkManagerによるバックグラウンド同期
  • クロックスキュー補正 — 必須のプラクティス:サーバー時刻とローカル時刻の差を保存し、クライアントのすべての計算を調整する
  • 分散システム — 厳密なイベント順序付けのために、論理時計(ランポート、ベクター)も使用される
  • 推奨事項 — AndroidでAUTO_TIMEステータスを確認し、自動同期が無効の場合はユーザーに警告し、非同期が5秒を超える場合は操作をブロックする

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください