0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

模試のPDFはどう届く?マナビジョンの管理・配信の仕組みを整理する

0
Posted at

PDFを開く操作を、役割ごとに見る

模試の問題や解説を開くとき、画面ではリンクを押すだけです。その裏では、教材の場所を知らせる処理、公開状態に応じた表示、トークンの発行、閲覧情報を扱う処理が関わっています。

マナビジョンの画面側の処理を見ると、これらの役割を分けた構成が読み取れます。この記事では、教材の識別情報と、その教材を開くための一時的な情報を分けるという視点から整理します。

内容は2026年10月12日時点の画面側の処理と一部のAPI応答から確認できる範囲に基づきます。サーバー内部の権限判定や、配信先で実際に拒否する挙動は未検証です。教材本文や実際の受験情報は掲載しません。

1. 教材のURLには「どのPDFか」が入っている

教材パスには、年度、学年、模試の回、問題・解説の区別、教科コードが含まれています。

実際のドメインや教材パスを使わず、構造を説明用に置き換えると、こんなイメージです。

https://storage.example.edu/media/{年度}/{学年}/{回}/
  {年度}_{学年}{回}_{種別}_{教科コード}.pdf

※改行は読みやすくするためのものです。storage.example.edu は架空の配信先です。

画面側の処理では、種別の M が問題、K が解説に対応しています。一方、画面が教材を開くために使うパスは、APIから受け取っています。命名規則だけを使ってURLを組み立てる構成として説明するのは適切ではありません。

ここには二つの役割があります。

情報 読み取れること
ディレクトリやファイル名の規則 どの年度・学年・回・教科の教材か
APIから受け取る教材情報 画面で利用する教材パスや公開情報

ファイル名に分類が含まれていると、保存した資料を整理する際にも意味が残ります。ただし、URLの形だけから、その教材が公開済みか、誰が閲覧できるかを判断することはできません。教材の識別と公開状態は、別の情報として扱う必要があります。

2. 公開情報から、画面に出すリンクを決める

教材一覧には、公開フラグや復習公開日時を参照し、問題・解説へのリンクの表示を決める処理があります。

教材のパスがデータに含まれていることと、その時点で画面にリンクを出すことは別です。識別情報に加えて公開状態を持たせることで、同じ一覧でも公開時期に応じた表示を作れます。

例えば教材配信画面を設計するなら、識別情報は「どの教材か」、公開情報は「いつ表示するか」に使えます。この二つを分けると、教材ファイルの分類を変えずに、公開予定や公開済みの表示を調整できます。

ここで確認できるのは、あくまで画面上の表示条件です。リンクを隠す処理と、サーバーがアクセスを許可する判断は、同じものではありません。画面側の条件だけでは、配信側の検証内容までは分かりません。

3. 教材URLを開く前に、トークンを受け取る

教材を開く側のコードには、次の経路があります。

  1. 教材URLと受験に関する情報を、ctnt-token/make に送る。
  2. 応答に含まれる ctnt.tkn を受け取る。
  3. その値を bc_token というCookieへ書き込む。
  4. window.open で教材URLを開く。

教材URLを開く前に、トークンを取得して保存する処理が挟まっているのが特徴です。

全体の構造は次のように整理できます。実線は画面側のコードにある経路、破線はトークン形式から想定される配信側の役割です。

window.open は、指定したURLを新しい、または既存の閲覧コンテキストに読み込むためのAPIです。コード内にこの呼び出しがあることと、PDFが正常に表示されることは別に確認する必要があります。MDN: Window.open

Cookieの Domain や Path は、ブラウザーが値を送る範囲を決める情報であり、それ自体が教材の閲覧権限を決めるわけではありません。また、Cookieの保存期限と、トークン内部の失効時刻も別の情報です。RFC 6265: Cookieの属性

4. トークンの「時間」と「教材範囲」を読む

公開済みの回に対する応答1件では、返されたトークンの確認できた部分に st、exp、教材パスに対応する acl の先頭部がありました。exp - st は 3,600秒、つまり1時間です。

これらは、Akamaiの公式EdgeAuth SDKが扱うトークンの要素と整合します。公式実装では st が開始時刻、exp が終了時刻、acl が許可するパスの範囲に対応します。Akamai公式SDKの実装

公式SDKの一般的な構造を概念例として表すと、次の形になります。

st=<開始>~exp=<失効>~acl=<教材範囲>~hmac=<改ざん検証用の値>

これは今回の応答を全文再現したものではありません。hmac は公式SDK側の構造を説明するために示しています。確認できた応答は acl の途中までで、トークンの後半全体を確認したものではありません。

公式SDKでは、各要素を ~ で連結し、ACLに複数のパスを指定する形式も扱えます。ただし、今回のACL全文は確認できていないため、単一ファイル・複数パス・ワイルドカードのどれに限定されているかは判断できません。Akamai公式SDK: ACLの例

時間と教材パスに対応する値を持つことから、トークン認証型の配信を想定した構成だと推測できます。ただし、形式が整合するだけでは、採用しているCDN、検証する場所、署名アルゴリズム、受験者の権限確認の内容までは確定できません。

1時間という値も、確認した1件についての情報です。すべての教材で共通の有効期間だと扱わず、教材の識別情報とは異なる、一時的な値として読む必要があります。

5. 教材を開く処理と、閲覧関連の処理は別にある

画面側には、stdt-answr-epn-view という閲覧関連APIを扱う処理もあります。また、解答・解説の初回表示日時を先生へ連携する旨の案内があります。教材を開くためのトークン取得とは、別の役割として捉えられます。

このAPIがサーバー側でどの項目をいつ保存するかまでは確認していません。

ファイルを届けることと、アプリに閲覧日時を残すことには、異なる役割があります。配信の処理を読んでいるときに閲覧記録のAPIが出てきても、それを配信の許可条件だと決めつけず、それぞれが扱う情報を見ると整理しやすくなります。

また、日時の記録処理があることだけでは、PDFを最後まで読んだことや、内容を理解したことまでは分かりません。教材サービスの「閲覧済み」を設計・解釈するときは、配信の成功、閲覧日時、学習の完了を分け、何のイベントを記録するかを明確にしておきたいところです。

6. PDFの管理台帳を設計するなら

この構成を踏まえると、教材を管理する際には、教材の識別情報、参照先、保存したファイルの情報を分ける設計が考えられます。以下はサービス内部のデータベースを示したものではなく、同種の教材を管理するための設計案です。

同じ模試体系内なら、教材の識別には次の組をキー候補として使えます。

年度 + 学年 + 回 + 教科 + 種別(問題/解説)

複数の試験体系を混ぜるなら、模試種別や試験IDも必要です。これらを複合キーとして、URLやファイルに関する情報を別の項目に持たせる案です。

項目 管理での役割
年度・学年・回・教科・種別 どの教材かを識別する
教材URL 出典や参照先を記録する
公開状態・公開日時 いつの情報を見ているか把握する
取得日時・保存ファイル名 保存したファイルを追跡する
チェックサム 保存内容の同一性を比較する

保存フォルダは、問題・解説と台帳を同じ場所に置くと対応を確認しやすくなります。以下は年度を含め、すべて架空の例です。

sample_exam/2099/grade2/round01/math/
├── question.pdf
├── explanation.pdf
└── metadata.json

台帳の1レコードをJSONで表すなら、例えば次のようにします。

{
  "exam_type": "sample_exam",
  "year": 2099,
  "grade": 2,
  "round": 1,
  "subject": "math",
  "kind": "question",
  "file": "question.pdf",
  "source_url": "https://storage.example.edu/sample.pdf",
  "fetched_at": null,
  "checksum": null
}

fetched_at と checksum は未取得なら空にし、保存時に記録する想定です。

この形なら、問題と解説を取り違えたり、同じ教科の別の回を上書きしたりするのを避けやすくなります。URLだけをキーにするより、教材の意味が台帳に残るのも利点です。参照先が変わった場合にも、識別情報とURLを別々に更新できます。

一方、トークンやCookieは恒久的な教材台帳に残す情報には向きません。教材を識別する値と、その時点で発行された有効期限付きの値を分けておくと、教材の管理とアクセスのための処理を混同しにくくなります。

仕組みを読むときの着眼点

一つの「PDFを開く」という操作でも、コードでは役割が分かれています。APIのメタデータから教材を選び、公開情報で表示を決め、トークンを受け取り、URLを開く。そのほかに、閲覧情報を扱う処理もあります。

PDFの実表示や配信側での拒否動作、未公開教材の挙動は未検証です。

それでも、教材の識別、画面での公開表示、期限付きトークン、閲覧記録を分けて捉える視点は、ほかのファイル配信サービスを理解したり、自分で教材管理の仕組みを設計したりするときにも役立ちます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?