[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-setevaya-bezopasnost-chto-takoe-jwt-kakova-ego-struktura-i-luchshie-praktiki-ispolzovaniya":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},854,"chto-takoe-jwt-kakova-ego-struktura-i-luchshie-praktiki-ispolzovaniya",24,"setevaya-bezopasnost","Сетевая безопасность","🔒","Что такое JWT, какова его структура и лучшие практики использования?","JWT (JSON Web Token) — компактный самодостаточный токен для безопасной передачи информации между сторонами в формате JSON, широко используемый для аутентификации и авторизации в REST API.\n\n### Структура JWT\n\nJWT состоит из трёх частей, разделённых точкой: `header.payload.signature`\n\nHeader (заголовок) — алгоритм подписи и тип токена:\n\n```json\n{\n  \"alg\": \"RS256\",\n  \"typ\": \"JWT\"\n}\n```\n\nPayload (полезная нагрузка) — утверждения (claims):\n\n```json\n{\n  \"sub\": \"user123\",\n  \"name\": \"Иван Петров\",\n  \"role\": \"MANAGER\",\n  \"iat\": 1700000000,\n  \"exp\": 1700003600,\n  \"iss\": \"auth.mybank.com\"\n}\n```\n\nСтандартные claims: `sub` (субъект), `iss` (издатель), `exp` (срок действия), `iat` (время выдачи), `aud` (аудитория), `jti` (уникальный идентификатор).\n\nSignature (подпись):\n\n```\nRSASHA256(\n  base64UrlEncode(header) + \".\" + base64UrlEncode(payload),\n  privateKey\n)\n```\n\n### Алгоритмы подписи\n\n| Алгоритм | Тип | Описание |\n|----------|-----|----------|\n| HS256 | Симметричный | HMAC + SHA-256, один ключ для подписи и проверки |\n| RS256 | Асимметричный | RSA + SHA-256, приватный ключ для подписи, публичный для проверки |\n| ES256 | Асимметричный | ECDSA + SHA-256, компактнее RSA при той же надёжности |\n\nДля банковских систем рекомендуется RS256 или ES256 — публичный ключ можно безопасно распространять между сервисами.\n\n### Реализация в Spring Boot\n\n\u003Cdetails>\u003Csummary>Генерация и валидация JWT\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Генерация JWT\npublic String generateToken(UserDetails user) {\n    return Jwts.builder()\n        .setSubject(user.getUsername())\n        .claim(\"role\", user.getAuthorities())\n        .setIssuedAt(new Date())\n        .setExpiration(new Date(System.currentTimeMillis() + 3600_000))\n        .setIssuer(\"auth.mybank.com\")\n        .setId(UUID.randomUUID().toString())\n        .signWith(privateKey, SignatureAlgorithm.RS256)\n        .compact();\n}\n\n\u002F\u002F Валидация JWT\npublic Claims validateToken(String token) {\n    return Jwts.parserBuilder()\n        .setSigningKey(publicKey)\n        .requireIssuer(\"auth.mybank.com\")\n        .build()\n        .parseClaimsJws(token)\n        .getBody();\n}\n```\n\n\u003C\u002Fdetails>\n\n### Хранение токенов на клиенте\n\n| Хранилище | Плюсы | Минусы |\n|-----------|-------|--------|\n| HttpOnly Cookie | Защита от XSS | Уязвим к CSRF (нужна CSRF-защита) |\n| localStorage | Простота использования | Уязвим к XSS |\n| sessionStorage | Очищается при закрытии вкладки | Уязвим к XSS |\n| В памяти (JS-переменная) | Наибольшая безопасность | Теряется при обновлении страницы |\n\nРекомендуется: access token в памяти + refresh token в HttpOnly Secure Cookie.\n\n### Best Practices\n\n1. Короткое время жизни access token — 5-15 минут\n2. Refresh token — для обновления access token (хранить в HttpOnly cookie)\n3. Не хранить чувствительные данные в payload — JWT можно декодировать без ключа (Base64)\n4. Использовать `jti` (JWT ID) — для возможности отзыва токенов\n5. Ротировать ключи — периодическая смена ключей подписи\n6. Проверять все claims — `exp`, `iss`, `aud`, `nbf`\n7. Blacklist для отзыва — при logout добавлять `jti` в Redis blacklist\n\n```java\n\u002F\u002F Проверка отозванных токенов\npublic boolean isTokenRevoked(String jti) {\n    return redisTemplate.hasKey(\"revoked:\" + jti);\n}\n\npublic void revokeToken(String jti, long expSeconds) {\n    redisTemplate.opsForValue().set(\"revoked:\" + jti, \"true\",\n        expSeconds, TimeUnit.SECONDS);\n}\n```\n\n> **На собеседовании:** интервьюер хочет услышать структуру JWT (три части), разницу между HS256 и RS256, и понимание того, что payload не зашифрован, а лишь закодирован. Частая ошибка — не упомянуть стратегию отзыва токенов и не знать про jti.","","middle",[15],"network-security",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое JWT, какова его структура и лучшие практики исполь — Gymterview","JWT (JSON Web Token) — компактный самодостаточный токен для безопасной передачи информации между сторонами в формате JSON, широко используемый для аутентификаци","JWT (JSON Web Token) — компактный самодостаточный токен для безопасной передачи информации между сторонами в формате JSO",[15,13],"JWT (JSON Web Token) — компактный самодостаточный токен для безопасной передачи информации между сторонами в формате JSON, широко используемый для аутентификации и авторизации в REST API.",true]