[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-setevaya-bezopasnost-kak-rabotaet-cors-i-kak-ego-nastroit":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},853,"kak-rabotaet-cors-i-kak-ego-nastroit",24,"setevaya-bezopasnost","Сетевая безопасность","🔒","Как работает CORS и как его настроить?","CORS (Cross-Origin Resource Sharing) — механизм, позволяющий браузеру делать запросы к серверу на другом домене (origin). По умолчанию браузер блокирует такие запросы из соображений безопасности (Same-Origin Policy).\n\n### Origin (источник)\n\nOrigin состоит из трёх частей: протокол + домен + порт.\n\n```\nhttps:\u002F\u002Fapp.mybank.com:443  — один origin\nhttps:\u002F\u002Fapi.mybank.com:443  — другой origin (другой домен)\nhttp:\u002F\u002Fapp.mybank.com:80    — другой origin (другой протокол и порт)\n```\n\n### Простые и preflight-запросы\n\nПростой запрос (не требует preflight):\n- Метод: GET, HEAD, POST\n- Заголовки: только стандартные (Accept, Content-Type с типом `text\u002Fplain`, `multipart\u002Fform-data`, `application\u002Fx-www-form-urlencoded`)\n\nPreflight-запрос (OPTIONS) выполняется перед основным запросом, если:\n- Метод: PUT, DELETE, PATCH\n- Нестандартные заголовки (например, `Authorization`)\n- `Content-Type: application\u002Fjson`\n\n\u003Cdetails>\u003Csummary>Схема preflight-запроса\u003C\u002Fsummary>\n\n```\nБраузер                                            Сервер\n   │──── OPTIONS \u002Fapi\u002Ftransfer ──────────────────────>│\n   │     Origin: https:\u002F\u002Fapp.mybank.com               │\n   │     Access-Control-Request-Method: POST           │\n   │     Access-Control-Request-Headers: Authorization │\n   │\u003C─── 200 OK ─────────────────────────────────────│\n   │     Access-Control-Allow-Origin: https:\u002F\u002Fapp.mybank.com\n   │     Access-Control-Allow-Methods: GET,POST,PUT   │\n   │     Access-Control-Max-Age: 3600                  │\n   │──── POST \u002Fapi\u002Ftransfer ─────────────────────────>│\n   │     Authorization: Bearer eyJhbG...              │\n   │\u003C─── 200 OK ─────────────────────────────────────│\n```\n\n\u003C\u002Fdetails>\n\n### Настройка CORS в Spring Boot\n\n\u003Cdetails>\u003Csummary>Пример конфигурации через WebMvcConfigurer\u003C\u002Fsummary>\n\n```java\n@Configuration\npublic class CorsConfig implements WebMvcConfigurer {\n\n    @Override\n    public void addCorsMappings(CorsRegistry registry) {\n        registry.addMapping(\"\u002Fapi\u002F**\")\n            .allowedOrigins(\n                \"https:\u002F\u002Fapp.mybank.com\",\n                \"https:\u002F\u002Fadmin.mybank.com\"\n            )\n            .allowedMethods(\"GET\", \"POST\", \"PUT\", \"DELETE\")\n            .allowedHeaders(\"Authorization\", \"Content-Type\", \"X-Request-Id\")\n            .exposedHeaders(\"X-Total-Count\")\n            .allowCredentials(true)\n            .maxAge(3600);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\u003Csummary>Пример конфигурации через Spring Security\u003C\u002Fsummary>\n\n```java\n@Bean\npublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n    http.cors(cors -> cors.configurationSource(request -> {\n        CorsConfiguration config = new CorsConfiguration();\n        config.setAllowedOrigins(List.of(\"https:\u002F\u002Fapp.mybank.com\"));\n        config.setAllowedMethods(List.of(\"GET\", \"POST\", \"PUT\", \"DELETE\"));\n        config.setAllowedHeaders(List.of(\"Authorization\", \"Content-Type\"));\n        config.setAllowCredentials(true);\n        return config;\n    }));\n    return http.build();\n}\n```\n\n\u003C\u002Fdetails>\n\n### Настройка CORS в Nginx\n\n\u003Cdetails>\u003Csummary>Конфигурация Nginx\u003C\u002Fsummary>\n\n```nginx\nlocation \u002Fapi\u002F {\n    if ($request_method = 'OPTIONS') {\n        add_header 'Access-Control-Allow-Origin' 'https:\u002F\u002Fapp.mybank.com';\n        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';\n        add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type';\n        add_header 'Access-Control-Max-Age' 3600;\n        return 204;\n    }\n\n    add_header 'Access-Control-Allow-Origin' 'https:\u002F\u002Fapp.mybank.com' always;\n    add_header 'Access-Control-Allow-Credentials' 'true' always;\n\n    proxy_pass http:\u002F\u002Fbackend;\n}\n```\n\n\u003C\u002Fdetails>\n\n### Важные правила безопасности\n\n- Никогда не используйте `*` в `Access-Control-Allow-Origin` для критичных приложений — указывайте конкретные домены\n- `allowCredentials(true)` несовместим с `allowedOrigins(\"*\")` — это требование спецификации\n- Preflight-ответ кешируется на стороне браузера в течение `Access-Control-Max-Age` секунд\n\n> **На собеседовании:** интервьюер проверяет понимание Same-Origin Policy, разницу между простым и preflight-запросом и умение настроить CORS в Spring. Частая ошибка — поставить `*` в allowed origins «чтобы работало» и не понимать, почему preflight падает.","","junior",[15],"network-security",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Как работает DHCP и как его настроить? — Gymterview","DHCP (Dynamic Host Configuration Protocol) — протокол автоматического назначения IP-адресов и сетевых параметров устройствам в сети.","DHCP (Dynamic Host Configuration Protocol) — протокол автоматического назначения IP-адресов и сетевых параметров устройс",[15,13],true]