Přeskočit na hlavní obsah

Bezpečnostní doporučení

1. Vždy používejte HTTPS

Veškerá komunikace s Klubero SSO musí používat HTTPS. HTTP požadavky budou odmítnuty.

✓ https://your-sso-domain.com/connect/authorize
✗ http://your-sso-domain.com/connect/authorize

2. Implementujte PKCE pro public klienty

Single Page Applications a mobilní aplikace musí používat PKCE:

// Vygenerujte code verifier a challenge
const verifier = generateCodeVerifier(); // Náhodný řetězec 43-128 znaků
const challenge = await sha256(verifier); // SHA256 hash

// Zahrňte v autorizačním požadavku
const authUrl = `https://your-sso-domain.com/connect/authorize?
code_challenge=${challenge}&
code_challenge_method=S256`;

// Zahrňte verifier v token požadavku
const tokenResponse = await fetch('/connect/token', {
body: `code_verifier=${verifier}&...`
});

3. Validujte parametr state

Vždy generujte a validujte parametr state pro prevenci CSRF útoků:

// Před přesměrováním
const state = generateRandomString(32);
sessionStorage.setItem('oauth_state', state);

// Po callbacku
const returnedState = new URLSearchParams(location.search).get('state');
const savedState = sessionStorage.getItem('oauth_state');

if (returnedState !== savedState) {
throw new Error('State mismatch - možný CSRF útok');
}

4. Bezpečné ukládání tokenů

Typ klientaDoporučení pro ukládání
Serverová aplikaceServerová session nebo šifrovaná cookie
SPAPaměť (ne localStorage), nebo httpOnly cookie přes BFF
Mobilní aplikaceSecure keychain/keystore
Desktopová aplikaceOS credential manager
Nikdy neukládejte tokeny v
  • localStorage (zranitelné XSS)
  • Plain cookies (zranitelné CSRF)
  • URL parametrech
  • Historii prohlížeče

5. Nikdy nevystavujte client secret

Client secret nesmí být nikdy vystaven v:

  • Frontend/klientském kódu
  • Verzovacím systému (používejte environment proměnné)
  • Logech
  • Chybových zprávách
  • URL

6. Validujte tokeny

Vždy validujte tokeny před tím, než jim budete důvěřovat:

// 1. Ověřte podpis pomocí JWKS
// 2. Zkontrolujte že issuer (iss) odpovídá vašemu SSO serveru
// 3. Zkontrolujte že audience (aud) odpovídá vašemu client_id
// 4. Zkontrolujte že expiration (exp) je v budoucnosti
// 5. Zkontrolujte že nonce odpovídá (pokud používáte)

7. Ošetřete expiraci tokenů

function isTokenExpired(token, bufferSeconds = 60) {
const payload = JSON.parse(atob(token.split('.')[1]));
const expiresAt = payload.exp * 1000;
return Date.now() >= expiresAt - (bufferSeconds * 1000);
}

// Obnovte proaktivně před expirací
if (isTokenExpired(accessToken, 300)) { // 5 min rezerva
accessToken = await refreshToken();
}

8. Používejte minimální scopes

Požadujte pouze scopes, které vaše aplikace skutečně potřebuje:

# Dobře - minimální scopes
scope=openid profile email

# Vyhněte se - požadování všeho
scope=openid profile email phone address offline_access users:read users:write

9. Implementujte správné odhlášení

Při odhlašování:

  1. Zneplatněte refresh token (na serveru)
  2. Vymažte všechny uložené tokeny
  3. Přesměrujte na SSO logout endpoint
  4. Vymažte session aplikace

10. Monitorujte bezpečnostní události

Sledujte tyto události, které mohou indikovat bezpečnostní problémy:

  • Více neúspěšných pokusů o přihlášení
  • Obnovení tokenu z nové IP/zařízení
  • Neobvyklé požadavky na scopes
  • Relace z neočekávané lokace