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

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