呂凱崴kaiweilu.tw

衛星影像圖磚授權閘門

2026 年 6 月起於國立中央大學太空及遙測研究中心實習期間,依中心需求主責完成並交付的衛星影像圖磚授權服務。買家在地圖上圈選範圍申請授權,管理員核准後,每一塊圖磚請求都即時檢查權杖、停權狀態與地理範圍;撤銷立即生效,取圖路徑不增加資料庫查詢。已部署於中心主機,並交付介接規格與可執行範例供合作平台接取。

期間
2026-06 起(實習;已部署於中心主機)
角色
依中心需求主責完成並交付:威脅模型、後端、雙語買家入口與管理後台、測試、系統文件、部署與介接規格;另實作參考前端自接取端驗證;交付後持續參與中心的後續開發;影像與切圖由中心提供
技術
Node.js、Express、SQLite(WAL)、node:crypto(AES-256-GCM)、Argon2id、PMTiles、Leaflet;參考前端 CesiumJS、Docker;systemd、TLS、GPG
規模
35 個圖磚集共 193 GB;三層權杖;98 項自動化測試;12 份系統文件

書審對應:附件 E-1

買家入口登入頁:衛星影像輪播與登入面板(示範實例畫面)
買家入口登入頁:衛星影像輪播與登入面板(示範實例畫面)
本頁目錄
  1. 任務背景
  2. 需求與難點
  3. 系統組成
  4. 威脅模型
  5. 三層權杖
  6. 記憶體查表與即時撤銷
  7. 範圍授權與透明圖磚
  8. 買家入口與管理後台
  9. 底圖:國土測繪中心 WMTS 與海外自動切換
  10. 測試:98 項
  11. 系統文件
  12. 部署
  13. 效能實測
  14. 介接規格與參考前端
  15. 工作季會報告

任務背景

國立中央大學太空及遙測研究中心(以下稱中心)接收 FORMOSAT-8A 等衛星影像,須以圖磚形式提供給瀏覽器網頁、QGIS 等桌面地理資訊軟體與合作單位的平台,而不開放影像資料庫直接存取。圖磚授權閘門是這些接取端取得影像的入口,使用者有三種角色:

  • 買家:自助註冊,在地圖上圈選範圍提出申請,核准後於網頁或 QGIS 取圖。
  • 管理員:中心人員,審核申請、管理會員與停權;管理後台只接受校內網段連線。
  • 接取端:合作平台的三維檢視器、QGIS 與買家自架的網站。

本人負責影像的授權、遞送與存取控制;影像及其切圖由中心提供,共 35 個 PMTiles 圖磚集、193 GB,單一檔案最大 2.8 GB。

需求與難點

  1. 範圍授權:授權單位是地理範圍(AOI)而非整個檔案;同一個影像檔,買家只能取得與核准範圍相交的圖磚。
  2. 撤銷即時:停權後,已核發且未到期的權杖必須在下一次取圖就失效,包括已貼進 QGIS 的長效網址。
  3. 熱路徑零資料庫查詢:地圖每次平移或縮放都會對進入畫面的每塊圖磚各發一次請求,授權檢查不能讓每塊多一次資料庫查詢。

難點在第 2、3 項須同時成立:權杖若完全無狀態,撤銷只能等權杖到期;每次取圖若回資料庫確認,熱路徑就多一次查詢。本系統的解法是權杖無狀態、可撤銷的狀態放在伺服器記憶體:權杖以認證加密保證由本系統核發且未被竄改,停權與授權狀態則在每次取圖時以記憶體查表判定。

系統組成

  • 閘門:以 Node.js 與 Express 撰寫的單一服務,負責帳號、權杖核發、範圍申請與審核、逐圖磚授權判斷與取圖,並直接提供買家入口與管理後台。後端 6 個模組、39 個路由處理器;權杖加解密、範圍幾何、資料層與用量紀錄各為獨立模組。
  • 資料層:SQLite(WAL 模式)保存管理員、會員、授權、範圍申請、停權、稽核與用量紀錄。
  • 影像:閘門以 pmtiles 套件依 z/x/y 從 PMTiles 檔讀出單塊圖磚,對外提供帶權杖的標準 XYZ 網址,QGIS 與 CesiumJS 可直接載入。FORMOSAT-8A 1 公尺產品為 z7 至 z18、10 公尺產品為 z7 至 z14;清單縮圖免登入,影像圖磚一律須經授權。

威脅模型

設計自威脅模型出發:

資產影像圖磚;買家帳號與密碼雜湊;授權資料(全部授權旗標、檔案清單、核准範圍、效期);三把彼此獨立的權杖金鑰(簽章、會員權杖、權杖加密),由伺服器環境設定提供;TLS 私鑰;稽核紀錄;備份檔。

攻擊者未核准者;想取得範圍外影像的買家;已停權仍想取圖的買家;持有外流網址者;網路竊聽者;猜測密碼或列舉帳號者。

信任邊界網際網路與閘門之間只開放 443 與 80,內部埠只綁本機迴路介面;瀏覽器只持有該買家自己的會員權杖與短效圖磚票;管理 API 限校內網段且須管理員登入;影像只經閘門以圖磚回傳,資料庫與檔案不直接對外提供存取。

威脅對應控制
偽造或竄改權杖AES-256-GCM 認證加密,金鑰只在伺服器;通過驗證即代表由本系統核發且未被改動
取得範圍外影像每塊圖磚與核准範圍做相交判斷,範圍外回傳透明圖磚;授權欄位皆空視為無授權
停權後繼續取圖每次取圖以記憶體查表判定停權;三個權杖核發端點同樣拒絕停權買家
含權杖的網址外流授權網址可綁定來源 IP;權杖設有效期;停權即時生效;外流網址也只能取得核准範圍
竊聽伺服器自行終止 TLS;HTTP 一律以 308 轉 HTTPS
密碼外洩後的離線破解密碼以 Argon2id 雜湊儲存
帳號列舉與密碼猜測拉平登入回應時間,不以時間差透露帳號是否存在;依端點分級的速率限制
備份外洩備份以 GPG 非對稱加密

三層權杖

權杖以 Node 內建 node:crypto 的 AES-256-GCM 加密,不使用第三方 JWT 套件;三種權杖對應三種接取方式。

權杖取得方式用途效期與綁定
會員權杖帳號密碼登入換發圖磚票、產生圖磚網址、提出範圍申請每次登入換發新權杖,舊權杖隨即失效;停權後無法再換發任何權杖
短效圖磚票以會員權杖換發瀏覽器與合作平台的三維檢視器取圖短效(取票端點核發者 300 秒),到期前由前端自動續票;每塊圖磚即時檢查停權與範圍
授權網址權杖以會員權杖自助產生,填入來源 IPQGIS 與自架網站的 XYZ 網址範圍與到期日隨買家的授權;可綁定來源 IP;每塊圖磚即時檢查停權與範圍

設計時比較過另一種做法:接取端持一張共用、綁定伺服器 IP 的長效權杖,替所有使用者代取圖磚。此法無法讓不同買家看到不同範圍,也無法精準撤銷單一買家,因此瀏覽器路徑採每位買家各自的會員權杖與短效圖磚票,授權網址權杖只保留給 QGIS 與固定 IP 的第三方。

每一塊圖磚的判斷

  1. 以伺服器金鑰解密權杖,並驗證 GCM 認證標籤。
  2. 檢查權杖的生效與到期時間。
  3. 確認買家未被停權:停權名單與會員紀錄的停權狀態一併判定。
  4. 授權網址權杖另比對請求來源 IP 與權杖綁定的 IP。
  5. 取出授權(全部授權、檔案清單、核准範圍),判斷圖磚的經緯度範圍是否與任一核准範圍相交。
  6. 相交則自 PMTiles 讀出圖磚回傳;不相交則回傳 HTTP 200 與 334 位元組的透明圖磚。

判斷一律預設拒絕:第 1 至 4 步任一不符即拒絕(來源 IP 不符與已停權回 403),授權欄位皆空視為無授權,只有明確核准的範圍才回傳影像內容。第 1 至 5 步都在記憶體內完成,不查資料庫。

記憶體查表與即時撤銷

記憶體查表SQLite 是會員、授權與停權資料的唯一真實來源;啟動時載入記憶體(Map),管理員核准、修改授權或停權時同時寫入資料庫與記憶體,取圖熱路徑只讀記憶體。架構文件的關鍵設計決策記載選用 SQLite 加記憶體快取、不引入 Redis:閘門為單一 Node.js 行程,授權判斷不必經網路存取外部快取。

撤銷狀態合併停權狀態有兩個來源:以買家帳號為鍵的停權名單,與會員紀錄上的停權欄位。兩者合併進熱路徑的會員有效性檢查,兩條取圖路徑都在停權後的下一次請求即被拒絕。

三個核發端點的攔截取票、圖磚網址與授權網址三個核發端點都拒絕停權買家,使其無法以自助換發新權杖延續存取。判斷仍是記憶體查表、不增加資料庫查詢,並以測試確保停權經任何取圖路徑皆立即生效。

實測自送出停權請求起,到同一張權杖、同一塊圖磚的請求由 200 轉為 403,5 次試驗為 3.61 至 4.01 ms(中位數 3.66 ms),相當於一次請求往返;權杖本身未過期,也未重新簽發。

即時撤銷示範:停權前連續三次取得影像,停權後同一張權杖、同一塊圖磚即回 403(示範實例;權杖已遮蔽)
即時撤銷示範:停權前連續三次取得影像,停權後同一張權杖、同一塊圖磚即回 403(示範實例;權杖已遮蔽)

範圍授權與透明圖磚

申請與審核買家在地圖上拖出一或多個矩形(地圖以虛線框標出可申請的影像涵蓋範圍),可附來源 IP 與備註;管理員在後台以地圖檢視、微調後核准或駁回,核准即授權該範圍內(與範圍相交)的影像。

逐圖磚判斷圖磚的經緯度範圍與核准範圍的矩形做相交判斷,並處理 Web Mercator 經度 ±180 度的環繞邊界;產生圖磚網址時,與核准範圍不相交的影像不予核發。

範圍外回傳透明圖磚範圍外回傳 HTTP 200 與透明圖磚,地圖軟體中的圖層因此在核准範圍邊界裁切、露出底圖。自接取端實測:同一張 1 公尺影像與圖磚票,範圍內 z14、z16 分別回傳 110,796 與 111,850 位元組的影像,範圍外回傳 334 位元組的透明 PNG,皆為 HTTP 200。

清單過濾公開清單列出全部 35 個圖磚集;測試買家登入後只剩與其核准範圍相交的 2 個。

買家於地圖圈選範圍申請授權(底圖為國土測繪中心臺灣通用電子地圖;示範實例)
買家於地圖圈選範圍申請授權(底圖為國土測繪中心臺灣通用電子地圖;示範實例)

買家入口與管理後台

買家入口中英雙語。註冊可要求電子郵件驗證;「我的圖磚」以卡片列出核准範圍內的影像,「更多圖磚」列出可另行申請者;卡片上填入來源 IP 即產生綁定該 IP 的 XYZ 網址,並附 QGIS 加入步驟。登入頁輪播 10 張衛星影像,壓縮至約 1.6 MB(原 4.6 MB),逐張標示版權並可暫停。

管理後台中英雙語、限校內網段:會員(狀態、到期與剩餘時間、授權範圍標籤)、範圍申請(買家、範圍框數、來源 IP、備註;以地圖檢視、微調後核准或駁回)、圖磚清單、使用與停權、管理員帳號。

雙語與無障礙自建、不需建置步驟的雙語字串機制,支援單複數與變數代入,缺字串時先退回另一語系、再退回鍵名,並以單元測試鎖定字串表結構。對話框具 role="dialog" 與 aria-modal,開啟時鎖定焦點、關閉後歸還;支援 prefers-reduced-motion;保留鍵盤焦點外框。

買家入口:「我的圖磚」與兩種取用方式(示範實例)
買家入口:「我的圖磚」與兩種取用方式(示範實例)
登入頁的英文介面
登入頁的英文介面

底圖:國土測繪中心 WMTS 與海外自動切換

範圍申請地圖的底圖由瀏覽器直接向圖資服務取得、不經閘門,選擇與切換規則皆依實測決定:

  • 臺灣範圍採國土測繪中心 WMTS「臺灣通用電子地圖」,其網址樣板為 {z}/{y}/{x}(列在前、行在後),與一般 XYZ 的 {z}/{x}/{y} 相反。
  • 依 OpenStreetMap 圖磚使用政策(志工營運的伺服器不供營運用途),不以其公用圖磚作營運底圖。
  • 國土測繪中心圖資只涵蓋臺灣:實測臺灣以外 z8 以上整張圖磚為單一海水藍(RGB 165, 220, 241),而影像另有東京與巴塞隆納兩地。
  • 疊圖方案經實測排除:透明版電子地圖在臺北 z14 有 71.7% 像素全透明、僅 9.3% 完全不透明。改為依視野二選一:看得到臺灣用國土測繪中心底圖,視野整個在臺灣以外即自動切換為全球底圖(CARTO Voyager);使用者手動選過即停止自動切換。
  • 單元測試鎖定三件會無聲出錯的事:座標順序被改回 {z}/{x}/{y}、底圖被換回 OSM、全球底圖漏標 OSM 貢獻者署名。

測試:98 項

  • 以 Node 內建 node:test 撰寫,共 15 個測試檔(單元 4、整合 11)與 3 個共用輔助程式,合計 98 項。單元測試涵蓋權杖加解密、底圖設定與雙語字串表。
  • 整合測試以共用啟動程式開啟獨立伺服器實例(暫存 SQLite、隨機埠、測試模式),再以流程輔助函式(註冊登入買家、核准範圍、產生授權網址、管理員操作)經 HTTP 驗證行為;其中監聽介面 12 項,鎖定對外埠、本機迴路綁定與 308 轉址。
  • 測試計畫書逐項編號(如 U-CT-1、I-RT-6、U-MAP-1)並說明測試環境隔離設計;測試報告書記錄 98 項全數通過,0 失敗、0 略過,連續執行 3 次結果一致,單次約 13.6 至 13.8 秒;ESLint 對程式與測試皆無錯誤與警告。
98 項測試全數通過(node:test 輸出)
98 項測試全數通過(node:test 輸出)

系統文件

12 份 Markdown 文件共 3,190 行,另有 SVG 系統流程圖;版本號採語意化版本。

類別文件內容
設計README、ARCHITECTURE、SECURITY角色名詞表與 6 張流程圖;系統脈絡、元件、請求流程、資料模型、部署視圖與關鍵設計決策;威脅模型與安全設計
介面API_SPEC、INTEGRATION_GUIDE、FRONTEND_HANDOFFAPI 規格、介接規格、交付說明
品質TEST_PLAN、TEST_REPORT、CODING_STANDARDS測試計畫書、測試報告書、程式撰寫規範
維運OPERATIONS、CHANGELOG、TODO維運手冊(部署、備份、憑證、故障排除,603 行);附決策理由與實測資料的變更紀錄;工作事項與優先序

部署

  • systemd 服務單元常駐並開機啟動;程式自行終止 TLS(Node 原生 https),不經 Nginx 反向代理。
  • 對外只監聽 443 與 80:80 一律回 308 轉 HTTPS,保留原方法與內容,使 QGIS 或 curl 的 POST 不被降級為 GET;內部埠只綁本機迴路。
  • 備份以 GPG 非對稱加密,輪替保留並驗證完整性;已以離線保管的私鑰完成還原演練。

效能實測

方法沿用整合測試的啟動程式另開獨立測試實例(暫存 SQLite、隨機埠),不對正式服務施加負載;壓測程式與測試實例同機,經本機迴路以 HTTP 直連,測試實例啟用來源 IP 檢查。每個情境 600 個請求,同時請求數 1、8、32,先以 200 個請求暖機;讀完回應內容才停止計時。分散情境自 189 塊候選中選出 51 塊有影像的圖磚輪流請求(探測時已讀過一次)。

結果單位為毫秒。

情境同時 1 個:p50/p95同時 8 個:p50/p95
基準端點:不檢查授權、不讀檔1.84/3.776.79/15.94
範圍外:完成全部授權判斷,回透明圖磚1.31/1.775.60/11.48
授權網址取同一塊圖磚(135,162 位元組)2.38/4.8611.24/20.06
圖磚票取同一塊圖磚2.02/4.1710.74/19.46
授權網址輪流取 51 塊圖磚(含讀檔)1.89/3.428.61/13.99
  • 範圍外情境完成權杖解密、停權查表、會員狀態與範圍判斷,只是不讀影像;其 p50(1.31 ms)與完全不檢查授權的基準端點(1.84 ms)無可辨差異。
  • 同時 8 個請求下,來源 IP 不符回 403 的 p50 為 6.61 ms、已停權買家回 403 為 6.95 ms,與基準端點(6.79 ms)相當,各 600 個請求全數回 403。
  • 連續執行兩次,關鍵數值一致:基準端點 p50 1.78/1.84 ms、授權路徑 1.30/1.31 ms、撤銷中位數 3.98/3.66 ms。

介接規格與參考前端

交付閘門端交付介接規格(305 行)、交付說明與完整版、精簡版兩個可直接執行的範例頁;參考前端另附 API 契約規格(含權杖生命週期與狀態碼)、串接指南與兩支最小串接範例頁。

參考前端2026 年 6 月另以 CesiumJS 實作模擬合作平台網站的參考前端(Node.js 22、Express、Docker Compose),自接取端把註冊、登入、畫範圍申請、管理員核准到只看得到核准範圍影像的流程端對端走過;範圍申請地圖直接載入閘門提供的 aoimap.js 元件。

  • 自動續票:每 20 秒檢查已疊上的圖層,到期前 60 秒重新取票,先建新圖層再移除舊圖層,換票時不閃爍,並以旗標避免重複續票。實機觀測 290 秒:兩次取票間隔 240.5 秒(300 秒效期減 60 秒提前量),取得 52 塊圖磚、只登入 1 次,圖層未中斷。
  • 401/403 語意分流:401(會員權杖失效)保留圖層、彈出重新登入並預填帳號,登入後自動還原;403(該影像授權被撤銷)只移除該圖層並提示,不登出;5xx 或網路錯誤於下一輪重試。實機中另一處登入使會員權杖換發後,前端即走 401 路徑。
  • 兩層判定:前端以已核准範圍與各影像邊界做矩形重疊判定,預先停用不重疊的影像卡片;此判定只作介面提示,授權一律由閘門在伺服器端判定。
  • 設計紀錄:以服務提供端與接取端兩種視角逐點檢驗架構,留下 13 份決策紀錄。
參考前端:三維地球與影像清單(未登入時可瀏覽公開清單與縮圖)
參考前端:三維地球與影像清單(未登入時可瀏覽公開清單與縮圖)

工作季會報告

2026 年 6 月於資源衛星接收站工作季會以本人名義報告本系統(7 頁):系統概念與設計理由(保護圖磚、集中控管且流程可追溯、標準化介接)、使用者辨識與驗證流程、自助註冊與後台審核、合作平台登入後才載入圖磚、QGIS 需正確授權網址才取得圖磚(以實機畫面對照),以及進度與下一步。報告所列的下一步(依權杖內使用者資訊限制可取得的圖磚、綁定來源 IP、即時停權)其後皆已實作,即本頁的逐圖磚範圍授權、來源 IP 綁定與即時撤銷。