Security: WebSocket Auth-Token aus Query-Parameter in Header verschieben #97

Closed
opened 2026-05-17 18:38:21 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-17 18:38:21 +00:00 (Migrated from github.com)

Problem

In WebSocketClientImpl.kt wird der Auth-Token als Query-Parameter übergeben:

wsHttpClient.webSocket("$wsUrl/ws/sync?token=$accessToken") { ... }

Der Token ist damit im Klartext in Server-Logs, Proxy-Logs und potenziell in Browser-Historien sichtbar – ein unnötiges Sicherheitsrisiko.

Lösung

Token als Authorization: Bearer-Header übertragen:

wsHttpClient.webSocket(
    urlString = "$wsUrl/ws/sync",
    request = { header(HttpHeaders.Authorization, "Bearer $accessToken") }
) { ... }

Auf der Server-Seite muss der Token entsprechend aus dem Header statt dem Query-Parameter gelesen werden.

Akzeptanzkriterien

  • WebSocket-Verbindung überträgt den Token ausschließlich im Authorization-Header
  • Query-Parameter ?token=... wird nicht mehr verwendet
  • Server liest Token aus dem Header
  • Bestehende WebSocket-Funktionalität (Sync, Messaging-Push) funktioniert weiterhin
## Problem In `WebSocketClientImpl.kt` wird der Auth-Token als Query-Parameter übergeben: ```kotlin wsHttpClient.webSocket("$wsUrl/ws/sync?token=$accessToken") { ... } ``` Der Token ist damit im Klartext in Server-Logs, Proxy-Logs und potenziell in Browser-Historien sichtbar – ein unnötiges Sicherheitsrisiko. ## Lösung Token als `Authorization: Bearer`-Header übertragen: ```kotlin wsHttpClient.webSocket( urlString = "$wsUrl/ws/sync", request = { header(HttpHeaders.Authorization, "Bearer $accessToken") } ) { ... } ``` Auf der Server-Seite muss der Token entsprechend aus dem Header statt dem Query-Parameter gelesen werden. ## Akzeptanzkriterien - [ ] WebSocket-Verbindung überträgt den Token ausschließlich im `Authorization`-Header - [ ] Query-Parameter `?token=...` wird nicht mehr verwendet - [ ] Server liest Token aus dem Header - [ ] Bestehende WebSocket-Funktionalität (Sync, Messaging-Push) funktioniert weiterhin
jreinemann-euris commented 2026-05-18 06:23:19 +00:00 (Migrated from github.com)

Abgeschlossen (2026-05-18)

Zyklen: 1
Tests: 8 WebSocket-Tests, 0 Fehler

Implementierte Artefakte

  • Client (WebSocketClientImpl.kt): Token wird als Authorization: Bearer Header gesendet, Query-Parameter ?token= entfernt
  • Server (WebSocketRoutes.kt): Token wird aus Authorization-Header gelesen statt aus Query-Parameter
  • Server (Routing.kt): Kommentar aktualisiert
  • Tests (WebSocketTest.kt): Alle 8 Tests auf Header-Auth umgestellt, alle bestanden
  • Integration-Tests (run-integration-tests.ps1): WebSocket-Verbindung mit Header aktualisiert

Abweichungen

Keine

## Abgeschlossen (2026-05-18) **Zyklen:** 1 **Tests:** ✅ 8 WebSocket-Tests, 0 Fehler ### Implementierte Artefakte - ✅ **Client (WebSocketClientImpl.kt)**: Token wird als `Authorization: Bearer` Header gesendet, Query-Parameter `?token=` entfernt - ✅ **Server (WebSocketRoutes.kt)**: Token wird aus `Authorization`-Header gelesen statt aus Query-Parameter - ✅ **Server (Routing.kt)**: Kommentar aktualisiert - ✅ **Tests (WebSocketTest.kt)**: Alle 8 Tests auf Header-Auth umgestellt, alle bestanden - ✅ **Integration-Tests (run-integration-tests.ps1)**: WebSocket-Verbindung mit Header aktualisiert ### Abweichungen Keine
Sign in to join this conversation.
No description provided.