網路安全在現代軟體開發中至關重要。本文將探討如何使用 Python 建構安全的網路應用程式,涵蓋 HTTPS 伺服器建置、網路應用程式安全強化、HTTP 請求處理、API 互動、JWT 應用,以及網路流量分析與封包擷取等導向。這些技術對於提升網路應用程式安全性至關重要,確保資料傳輸安全及系統穩定性。實務程式碼範例與最佳實務建議,將協助開發者更有效地應用這些技術。
建構安全的 HTTP 伺服器
安全通訊是網路應用不可或缺的一環。以下將示範如何使用 SSL 建立安全的 HTTP 伺服器,確保資料傳輸的安全性。
from http.server import HTTPServer, BaseHTTPRequestHandler
import ssl
class SecureHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'您好,世界!')
if __name__ == '__main__':
https_server = HTTPServer(('localhost', 4443), SecureHTTPRequestHandler)
# 建立 SSL Context
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
# 載入憑證
context.load_cert_chain(certfile="cert.pem", keyfile="key.pem")
# 將 Socket 包裝成 SSL Socket
https_server.socket = context.wrap_socket(https_server.socket, server_side=True)
# 啟動伺服器
https_server.serve_forever()
內容解密:
這段程式碼建立了一個簡單的 HTTPS 伺服器。SecureHTTPRequestHandler 類別繼承自 BaseHTTPRequestHandler,並覆寫了 do_GET 方法來處理 GET 請求。伺服器監聽本地端的 4443 埠。
關鍵步驟在於使用 ssl.create_default_context() 建立 SSL Context,並載入憑證檔案 cert.pem 和金鑰檔案 key.pem。接著,使用 context.wrap_socket() 將伺服器的 Socket 包裝成 SSL Socket,確保所有通訊都經過加密。
執行伺服器前,需要先使用 OpenSSL 產生憑證和金鑰:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
產生憑證時,需要輸入一些資訊,例如國家、省份、城市、組織名稱等等。Common Name 必須設定為伺服器的網域名稱或 IP 地址。
強化網路應用安全性
除了使用 SSL,還有其他方法可以強化網路應用安全性:
- 輸入驗證: 嚴格驗證使用者輸入,防止惡意程式碼注入。
- 授權與認證: 實施 robust 的授權與認證機制,確保只有授權使用者才能存取敏感資料。
- 定期更新: 定期更新軟體和函式庫,修補已知的安全漏洞。
- 日誌記錄: 記錄所有重要的操作和事件,以便追蹤和分析安全問題。
效能調校技巧
以下是一些提升網路應用效能的技巧:
- 非同步程式設計: 使用非同步 I/O 處理大量併發連線,避免效能瓶頸。
- 連線池: 使用連線池重複利用已建立的連線,減少建立連線的開銷。
- 資料壓縮: 壓縮傳輸的資料,減少網路頻寬消耗。
- 快取: 使用快取機制儲存常用的資料,減少資料函式庫查詢次數。
透過以上技巧,可以有效提升網路應用效能和安全性,開發更 robust 的網路服務。
這個部分示範瞭如何使用 Python 建立安全的 HTTP 伺服器,並探討了提升網路應用效能和安全性的實務技巧。希望這些資訊能幫助讀者更好地理解 Python 網路程式設計,並應用於實際專案中。
深入解析 Python 的 HTTP 客戶端:urllib 模組的應用與技巧
HTTP 協定作為網路世界的根本,其客戶端的構建與應用至關重要。在 Python 中,urllib 模組提供了一套強大的工具,讓我們能夠輕鬆地與 HTTP 伺服器互動。這篇文章將探討 urllib 模組的應用,並分享一些實踐中的技巧。
HTTP 協定基礎回顧
在開始之前,讓我們快速回顧一下 HTTP 協定的基本概念。HTTP 是一個應用層協定,定義了客戶端、代理和伺服器之間資訊交換的規則。它主要由兩個元素組成:客戶端向伺服器傳送的請求,以及伺服器傳回的回應。HTTP 是一個無狀態協定,它不儲存客戶端和伺服器之間交換的資訊。因此,我們需要藉助其他技術,例如 cookies 或 sessions 來儲存資料。
伺服器會傳回一個 HTTP 狀態碼,指示操作的結果。此外,請求和回應中都可以使用標頭來包含額外的資訊。值得注意的是,HTTP 協定在底層使用 sockets 建立客戶端-伺服器連線。在 Python 中,我們可以使用更高階別的模組,例如 urllib.request,它將底層的 socket 操作抽象化,簡化了我們的開發工作。
使用 urllib 模組構建 HTTP 客戶端
urllib 模組允許我們透過各種協定存取網路上的資源。以下是如何使用 urllib 模組構建 HTTP 客戶端的示例:
import urllib.request
import urllib.parse
# 使用 urlopen 函式傳送 GET 請求
response = urllib.request.urlopen('https://www.example.com')
# 讀取回應內容
html = response.read().decode('utf-8')
print(html)
# 使用 urlencode 函式編碼 POST 資料
data_dictionary = {'key1': 'value1', 'key2': 'value2'}
data = urllib.parse.urlencode(data_dictionary)
data = data.encode('ascii')
# 使用 urlopen 函式傳送 POST 請求
response = urllib.request.urlopen('https://www.example.com/post', data)
# 讀取回應內容
response_data = response.read().decode('utf-8')
print(response_data)
內容解密:
以上程式碼片段展示瞭如何使用 urllib.request 模組傳送 GET 和 POST 請求。urlopen 函式傳回一個類別似檔案的物件,我們可以使用 read()、readline()、readlines() 和 close() 等方法操作它。對於 POST 請求,我們需要使用 urllib.parse.urlencode 函式將資料字典編碼為正確的格式。
處理 JSON 回應
如果伺服器傳回 JSON 格式的回應,我們可以使用 Python 的 json 模組處理它:
import urllib.request
import json
url = "https://api.example.com/data"
with urllib.request.urlopen(url) as response:
json_data = json.loads(response.read().decode("utf-8"))
print(json_data)
內容解密:
這段程式碼展示瞭如何使用 json.loads() 方法將 JSON 格式的回應轉換為 Python 字典。
自定義請求標頭
我們可以使用 urllib.request 模組自定義請求標頭,例如 User-Agent:
import urllib.request
from urllib.request import Request
url = "https://www.example.com"
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
# 方法一:使用 build_opener
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', user_agent)]
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
# 方法二:使用 Request 物件
request = Request(url)
request.add_header('User-agent', user_agent)
response = urllib.request.urlopen(request)
# 讀取回應標頭
for header, value in response.getheaders():
print(f"{header}: {value}")
內容解密:
這段程式碼展示了兩種自定義 User-Agent 標頭的方法。第一種方法是使用 build_opener 建立一個 opener 物件,並使用 addheaders 屬性增加標頭。第二種方法是使用 Request 物件,並使用 add_header 方法增加標頭。
流程圖示例
以下是一個使用 Plantuml 語法繪製的流程圖,展示了使用 urllib 模組傳送 HTTP 請求的過程:
流程解密:
此圖示展示了使用 urllib 傳送 HTTP 請求的主要步驟,包括建立請求、傳送請求、接收回應以及處理結果等關鍵流程。每一步驟之間的邏輯關係清晰地反映在圖表中,有助於理解整個處理流程。
總結:urllib 模組提供了一套簡潔而強大的工具,方便我們在 Python 中進行 HTTP 程式設計。透過理解其核心功能和技巧,我們可以更有效地與網路資源互動,構建更強大的應用程式。掌握這些技巧對於提升開發效率至關重要。
從網址擷取Email:urllib.request的應用與實務技巧
在網路爬蟲或資訊收集的過程中,經常需要從特定網址中擷取Email地址。Python的urllib.request模組搭配正規表示式,提供了一個有效率的解決方案。以下將深入解析如何運用此技術,並分享一些實務上的技巧。
import urllib.request
import re
def fetch_email_from_url(url):
try:
with urllib.request.urlopen(url) as response:
html_content = response.read().decode('utf-8')
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
emails_found = re.findall(email_pattern, html_content)
return emails_found
except Exception as e:
print(f"錯誤發生: {e}")
return []
# 使用範例
url_to_scrape = "https://example.com"
emails = fetch_email_from_url(url_to_scrape)
if emails:
print("找到的Email地址:")
for email in emails:
print(email)
else:
print("沒有找到任何Email地址。")
程式碼說明:
fetch_email_from_url函式:- 使用
urllib.request.urlopen開啟指定的URL並讀取其內容。 - 利用正規表示式比對Email地址。
- 回傳找到的所有Email地址列表。
- 使用
email_pattern:- 一個用於比對大多數Email格式的正規表示式模式,能夠識別常見的Email結構。
錯誤處理:
- 當請求失敗或解碼錯誤時,會捕捉異常並輸出錯誤訊息,避免程式當機。
最佳實踐:
- 總是檢查目標網站的使用條款和robots.txt,以確保爬蟲行為符合規定。
- 對大規模爬取操作實施適當的延遲,避免對目標伺服器造成過大負擔。
- 使用適當的User-Agent標頭,以標識爬蟲身份,便於網站管理員識別和管理爬蟲行為。
本篇技術文章探討了Python在網路安全與HTTP客戶端構建方面的應用,從建立安全的HTTPS伺服器到使用urllib模組進行高效的網路請求,再到從網頁中提取Email地址的實務技巧。這些內容不僅展示了Python在網路程式設計方面的強大功能,也提供了多個實用的程式範例和最佳實踐建議,有助於開發人員更好地理解和應用相關技術,以構建更安全、更高效的網路服務和應用程式。
深入探索 Python 網路程式設計:從 HTTP 請求到 API 互動
Python 的網路程式設計功能強大且靈活,能夠滿足各種網路應用需求。本文將探討如何使用 Python 進行網路程式設計,涵蓋 HTTP 請求、檔案下載、API 互動等主題,並提供實用的程式碼範例和最佳實踐。
使用 urllib.request 模組進行 HTTP 請求
urllib.request 是 Python 內建的模組,用於處理 HTTP 請求。以下範例展示如何使用該模組傳送 GET 請求並擷取網頁內容中的 Email 地址。
import urllib.request
import re
USER_AGENT = 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.101 Mobile Safari/537.36'
url = input("請輸入網址:")
opener = urllib.request.build_opener()
opener.addheaders = [('User-agent', USER_AGENT)]
urllib.request.install_opener(opener)
try:
response = urllib.request.urlopen(url)
html_content = response.read().decode('utf-8')
pattern = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}")
emails = re.findall(pattern, html_content)
if emails:
print("找到的Email地址:")
for email in emails:
print(email)
else:
print("未找到Email地址。")
except urllib.error.URLError as e:
print(f"網址錯誤:{e.reason}")
except Exception as e:
print(f"發生錯誤:{e}")
內容解密:
此程式碼首先設定了使用者代理(User-Agent),模擬瀏覽器行為以避免被網站封鎖。接著,它使用 urllib.request 開啟網址,讀取 HTML 內容,並使用正規表示式搜尋 Email 地址。該正規表示式能夠精確比對 Email 地址格式,減少誤判。此外,程式碼加入了錯誤處理機制,可以捕捉網址錯誤和其他異常,提升程式碼的穩定性。
使用 urllib.request 下載檔案:兩種方法與效能比較
urllib.request 模組提供了兩種下載檔案的方法:urlretrieve() 和 urlopen()。以下將分別示範這兩種方法,並分析它們的優缺點。
方法一:urlretrieve()
import urllib.request
url = "https://www.python.org/static/img/python-logo.png"
urllib.request.urlretrieve(url, "python_logo.png")
print("檔案下載完成!")
內容解密:
urlretrieve() 方法可以直接下載檔案,語法簡潔。它會將檔案儲存到指定的本地路徑。
方法二:urlopen()
import urllib.request
url = "https://www.python.org/static/img/python-logo.png"
with urllib.request.urlopen(url) as response:
with open("python_logo.png", "wb") as file:
file.write(response.read())
print("檔案下載完成!")
內容解密:
urlopen() 方法需要手動將檔案內容寫入本地檔案。這種方法更靈活,可以控制下載過程,例如顯示下載進度或處理特設定檔案型別。
分塊下載:提升下載效率
對於大型檔案,分塊下載可以有效提升效率和穩定性。
import urllib.request
url = "http://ftp.debian.org/debian/dists/stable/contrib/Contents-all.gz"
with urllib.request.urlopen(url) as response:
with open("Contents-all.gz", "wb") as file:
chunk_size = 8192
while True:
chunk = response.read(chunk_size)
if not chunk:
break
file.write(chunk)
print("檔案下載完成!")
內容解密:
這段程式碼以指定的塊大小(例如 8KB)讀取檔案內容,並將每個塊寫入本地檔案。這種分塊下載的方式可以有效降低記憶體佔用,並提高下載大型檔案的穩定性。
使用 requests 建立 HTTP Client:簡化 REST API 互動
requests 模組簡化了與 RESTful API 的互動。以下將示範如何使用 requests 進行 GET 請求,並解析 response 物件的屬性。
import requests
url = "https://www.python.org"
response = requests.get(url)
print(f"狀態碼:{response.status_code}")
print(f"網頁內容:{response.text}")
for key, value in response.headers.items():
print(f"{key}: {value}")
內容解密:
requests.get() 方法傳送 GET 請求到指定網址,並傳回一個 response 物件。response.status_code 屬性包含 HTTP 狀態碼,response.text 屬性包含網頁內容。response.headers 屬性包含伺服器傳回的 headers。
解析網頁標頭資訊與抓取 robots.txt
網頁標頭資訊包含了伺服器與網頁相關的重要資訊,例如伺服器型別、內容型別、編碼方式等。利用 requests 模組,我們可以輕鬆取得這些資訊。
import requests
def get_headers(domain):
response = requests.get(f"http://{domain}")
if response.status_code == 200:
return response.headers
else:
return None
if __name__ == "__main__":
domain = input("輸入網址:http://")
headers = get_headers(domain)
if headers:
for key, value in headers.items():
print(f"{key} --> {value}")
else:
print("無法取得標頭資訊")
內容解密:
這段程式碼定義了一個 get_headers 函式,接收網址作為引數,使用 requests.get() 傳送 GET 請求。如果請求成功(狀態碼為 200),則傳回 response 的 headers 屬性,其中包含了所有標頭資訊。否則,傳回 None。
同樣地,我們可以使用 requests 抓取 robots.txt 檔案。
import requests
def get_robots_txt(url):
response = requests.get(f"{url}/robots.txt")
if response.status_code == 200:
return response.text
else:
return None
if __name__ == "__main__":
url = input("輸入網址:")
robots_txt = get_robots_txt(url)
if robots_txt:
print(robots_txt)
else:
print("無法取得 robots.txt 檔案")
下載圖片與與 GitHub API 互動
使用 requests 模組搭配 shutil 模組,可以輕鬆下載網頁上的圖片。
import requests
import shutil
def download_image(url, filename):
response = requests.get(url, stream=True)
with open(filename, 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
if __name__ == "__main__":
image_url = input("輸入圖片網址:")
filename = input("輸入儲存檔名:")
download_image(image_url, filename)
print(f"圖片已儲存至 {filename}")
此外,requests 也適用於與各種 API 互動,例如 GitHub API,可以用來擷取使用者資訊、倉函式庫資料等。
進階 HTTP 請求處理:玄貓的專業
在現代網路開發中,掌握進階 HTTP 請求處理技術對於建立穩健的應用程式至關重要。本文將探討使用 Python 的 requests 模組進行複雜 HTTP 請求的方法,並提供實用的實作範例。
處理 JSON 資料與自訂請求標頭
當與 RESTful API 互動時,正確處理 JSON 資料和設定自訂請求標頭是關鍵。以下範例示範如何傳送包含 JSON 承載的 POST 請求:
import requests
import json
url = 'https://httpbin.org/post'
payload = {
"key1": "value1",
"key2": "value2"
}
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.post(url, json=payload, headers=headers)
if response.status_code == 200:
print('回應 JSON:')
print(json.dumps(response.json(), indent=4))
內容解密:
這段程式碼展示瞭如何使用 requests.post() 方法傳送 JSON 資料。透過設定 json 引數,requests 自動將字典轉換為 JSON 格式並設定適當的 Content-Type 標頭。回應內容使用 json.dumps() 以縮排格式列印,增強可讀性。
處理 Cookies 與工作階段管理
在需要維護狀態的應用程式中,正確管理 cookies 和工作階段至關重要。以下範例示範如何使用 requests.Session() 管理永續性連線:
import requests
with requests.Session() as session:
session.headers.update({
'Accept': 'application/json'
})
response = session.get('https://httpbin.org/cookies/set/sessioncookie/1234567890')
print('Cookies 設定回應:')
print(response.text)
response = session.get('https://httpbin.org/cookies')
print('\n目前 Cookies:')
print(response.text)
內容解密:
這段程式碼建立了一個 requests.Session() 物件,用於在多個請求中保持 cookies 和其他引數的一致性。首先,它設定了一個 GET 請求來設定 cookies,然後傳送另一個 GET 請求來檢索目前的 cookies。這種方法對於需要跨多個請求保持狀態的應用程式非常有用。
處理重定向與逾時設定
在處理 HTTP 請求時,控制重定向行為和設定適當的逾時值對於應用程式的穩定性至關重要。以下範例示範如何自訂這些設定:
import requests
# 停用重定向
response = requests.get('http://github.com', allow_redirects=False)
print(f'狀態碼(停用重定向):{response.status_code}')
# 設定逾時
try:
response = requests.get('https://httpbin.org/delay/3', timeout=1)
except requests.Timeout:
print('請求逾時')
內容解密:
這段程式碼首先示範如何透過設定 allow_redirects=False 來停用自動重定向處理。這在需要直接檢查原始回應狀態碼的情況下非常有用。接著,它展示瞭如何設定請求逾時,使用 timeout 引數指定等待伺服器回應的最大秒數。這種機制有助於防止應用程式在等待回應時無限期掛起。
使用代理伺服器與 SSL 驗證
在某些網路環境中,使用代理伺服器和適當的 SSL 驗證對於安全的 HTTP 通訊至關重要。以下範例示範如何組態這些設定:
import requests
# 組態代理
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080'
}
# 停用 SSL 驗證(不建議在生產環境中使用)
response = requests.get('https://httpbin.org/get', proxies=proxies, verify=False)
print(f'SSL 驗證停用狀態碼:{response.status_code}')
內容解密:
這段程式碼展示瞭如何使用 proxies 字典組態代理伺服器,用於 HTTP 和 HTTPS 請求。同時,它示範瞭如何透過設定 verify=False 停用 SSL 驗證。需要注意的是,在生產環境中停用 SSL 驗證會降低安全性,因此應謹慎使用,並盡可能使用有效的憑證進行驗證。
繼續探討 JWT 的結構與實作
在前一節中,我們深入瞭解了 JWT 的基本結構,包括標頭(Header)和有效負載(Payload)。現在,讓我們繼續探討 JWT 的第三部分:簽名(Signature),以及如何在 Python 中實作 JWT。
- Signature (簽名): 簽名部分是 JWT 安全性的關鍵。它透過將 Base64 編碼的標頭和有效負載與一個秘密金鑰結合,使用指定的演算法(如 HS256)進行簽名計算得出。簽名確保了 JWT 在傳輸過程中未被篡改。
JWT 的簽名流程
- 將標頭和有效負載分別進行 Base64Url 編碼。
- 將編碼後的標頭和有效負載用點號連線,形成
HEADER.PAYLOAD字串。 - 使用指定的演算法和秘密金鑰對
HEADER.PAYLOAD字串進行簽名。
在 Python 中使用 PyJWT 函式庫操作 JWT
PyJWT 是一個用於處理 JWT 的 Python 函式庫。以下是如何使用 PyJWT 生成和驗證 JWT 的範例:
首先,安裝 PyJWT:
pip install PyJWT
生成 JWT
import jwt
import datetime
# 定義秘密金鑰
secret_key = "your_secret_key"
# 定義 payload
payload = {
"user_id": 123,
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=30) # 設定過期時間
}
# 生成 JWT
token = jwt.encode(payload, secret_key, algorithm="HS256")
print("Generated JWT:", token)
驗證 JWT
try:
# 驗證 JWT
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print("Decoded Payload:", decoded_payload)
except jwt.ExpiredSignatureError:
print("Token has expired")
except jwt.InvalidTokenError:
print("Invalid token")
內容解密: 這段程式碼展示瞭如何使用 PyJWT 函式庫生成和驗證 JWT。生成 JWT 時,我們定義了一個包含使用者 ID 和過期時間的 payload,並使用 HS256 演算法進行簽名。驗證 JWT 時,我們使用相同的秘密金鑰和演算法來解碼 token,並檢查其是否過期或無效。
網路流量分析與封包擷取技術
隨著網路安全威脅日益增加,深入分析網路流量已成為維護網路完整性的關鍵步驟。本文將探討使用 pcapy-ng 這個強大的 Python 模組進行網路封包擷取和分析的技術實踐,特別是在台灣本地網路環境中的應用。
pcapy-ng 模組安裝與設定
在開始使用 pcapy-ng 之前,需要透過以下指令安裝此模組:
pip install pcapy-ng
安裝完成後,開發者可以利用 pcapy-ng 提供的 API 介面來捕捉網路封包。以下是一個基本的範例,展示如何使用 pcapy-ng 擷取網路封包:
import pcapy
# 開啟網路介面進行封包擷取
cap = pcapy.open_live("any", 65536, 1, 0)
# 定義封包處理函式
def packet_handler(header, data):
print("擷取到封包:", data)
# 開始擷取封包
while True:
(header, data) = cap.next()
packet_handler(header, data)
內容解密:
這段程式碼首先使用 pcapy.open_live() 方法開啟指定的網路介面進行封包擷取,其中引數 "any" 表示擷取所有網路介面的封包。接著定義了一個 packet_handler() 函式來處理每個擷取到的封包,最後進入無限迴圈持續擷取並處理封包。
網路封包分析技術
擷取到網路封包後,下一步是對這些封包進行深入分析。開發者可以根據不同的協定(如 TCP、UDP、ICMP 等)對封包進行分類別和分析。以下是一個範例,展示如何解析擷取到的封包:
import pcapy
import dpkt
# 開啟網路介面進行封包擷取
cap = pcapy.open_live("any", 65536, 1, 0)
def packet_handler(header, data):
# 使用 dpkt 解析封包
eth = dpkt.ethernet.Ethernet(data)
if eth.type == dpkt.ethernet.ETH_TYPE_IP:
ip = eth.data
print("IP 封包:", ip.src, "->", ip.dst)
# 開始擷取封包
while True:
(header, data) = cap.next()
packet_handler(header, data)
內容解密:
這段程式碼結合了 pcapy-ng 和 dpkt 兩個模組,dpkt 用於解析網路封包。在 packet_handler() 函式中,首先將擷取到的原始資料解析為 Ethernet 幀,接著判斷是否為 IP 封包,如果是,則進一步解析 IP 封包的來源和目的 IP 位址。
網路流量視覺化
為了更直觀地理解網路流量,可以使用視覺化工具來展示封包的流動情況。展示網路流量的基本流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam sequenceArrowThickness 2
title Python網路安全程式設計技巧
actor "客戶端" as client
participant "API Gateway" as gateway
participant "認證服務" as auth
participant "業務服務" as service
database "資料庫" as db
queue "訊息佇列" as mq
client -> gateway : HTTP 請求
gateway -> auth : 驗證 Token
auth --> gateway : 認證結果
alt 認證成功
gateway -> service : 轉發請求
service -> db : 查詢/更新資料
db --> service : 回傳結果
service -> mq : 發送事件
service --> gateway : 回應資料
gateway --> client : HTTP 200 OK
else 認證失敗
gateway --> client : HTTP 401 Unauthorized
end
@enduml
流程解密:
此流程圖展示了客戶端與伺服器之間的網路通訊流程。客戶端傳送請求到網路交換器,交換器將請求轉發到路由器,路由器再將請求路由到目標伺服器。伺服器處理請求後,將回應沿著相同的路徑傳回給客戶端。