[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-kak-obespechit-bezopasnost-rest-api":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},1226,"kak-obespechit-bezopasnost-rest-api",34,"rest-api","REST API","🌐","Как обеспечить безопасность REST API?","Безопасность REST API — комплексная задача, включающая несколько уровней защиты: от транспортного шифрования до аудита действий.\n\n### Чек-лист безопасности REST API\n\n| Уровень | Меры |\n|---------|------|\n| Транспорт | HTTPS (TLS) для всех endpoint-ов |\n| Аутентификация | JWT \u002F OAuth 2.0 \u002F API Key |\n| Авторизация | Ролевая модель (@PreAuthorize) |\n| Валидация | Все входные данные (@Valid) |\n| Rate Limiting | Защита от DDoS и brute-force |\n| CORS | Только доверенные домены |\n| DTO | Вместо сущностей в API (защита от Mass Assignment) |\n| Заголовки | X-Content-Type-Options, X-Frame-Options, HSTS |\n| Информация | Нет утечки стек-трейсов, версий, внутренних ID |\n| Аудит | Логирование аутентификации, авторизации, изменений |\n\n### Защита от массового присваивания (Mass Assignment)\n\n```java\n\u002F\u002F Опасно — клиент может передать {\"role\": \"ADMIN\"}\n@PostMapping\npublic User create(@RequestBody User user) { ... }\n\n\u002F\u002F Безопасно — DTO содержит только допустимые поля\n@PostMapping\npublic UserDto create(@RequestBody CreateUserRequest request) { ... }\n```\n\n\u003Cdetails>\u003Csummary>Примеры конфигурации Spring Security\u003C\u002Fsummary>\n\nАвторизация на уровне методов:\n```java\n@PreAuthorize(\"hasRole('ADMIN')\")\n@DeleteMapping(\"\u002Fusers\u002F{id}\")\npublic ResponseEntity\u003CVoid> deleteUser(@PathVariable Long id) { ... }\n\n@PreAuthorize(\"hasRole('USER') and #id == authentication.principal.id\")\n@GetMapping(\"\u002Fusers\u002F{id}\u002Fprofile\")\npublic ResponseEntity\u003CProfile> getProfile(@PathVariable Long id) { ... }\n```\n\nЗащита заголовков:\n```java\n@Bean\npublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {\n    return http\n        .headers(headers -> headers\n            .contentTypeOptions(Customizer.withDefaults())       \u002F\u002F X-Content-Type-Options: nosniff\n            .frameOptions(frame -> frame.deny())                  \u002F\u002F X-Frame-Options: DENY\n            .httpStrictTransportSecurity(hsts -> hsts\n                .maxAgeInSeconds(31536000)\n                .includeSubDomains(true)))                        \u002F\u002F Strict-Transport-Security\n        .build();\n}\n```\n\nМинимизация раскрытия информации:\n```yaml\nserver:\n  error:\n    include-stacktrace: never\n    include-message: never\n```\n\nАудит:\n```java\n@Aspect\n@Component\n@Slf4j\npublic class AuditAspect {\n\n    @AfterReturning(\"@annotation(auditable)\")\n    public void audit(JoinPoint joinPoint, Auditable auditable) {\n        String user = SecurityContextHolder.getContext()\n            .getAuthentication().getName();\n        log.info(\"Audit: user={}, action={}, method={}\",\n                 user, auditable.action(), joinPoint.getSignature().getName());\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** нужно перечислить минимум 5-6 уровней защиты из чек-листа. Частая ошибка — говорить только про аутентификацию и забыть про валидацию, CORS, Rate Limiting и DTO.","","middle",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Как обеспечить безопасность REST API? — Gymterview","Безопасность REST API — комплексная задача, включающая несколько уровней защиты: от транспортного шифрования до аудита действий.","Безопасность REST API — комплексная задача, включающая несколько уровней защиты: от транспортного шифрования до аудита д",[15,13],true]