рдХреЙрд░реНрд╕ рдЯреЗрд╕реНрдЯрд░
рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рди рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ (рдХреЙрд░реНрд╕) рдиреАрддрд┐рдпреЛрдВ рдФрд░ рдПрдкреАрдЖрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдбрд┐рдмрдЧ рдХрд░реЗрдВ
рдХреЙрд░реНрд╕ рдХреНрдпрд╛ рд╣реИ? рдХреЙрд░реНрд╕ (рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рди рд░рд┐рд╕реЛрд░реНрд╕ рд╢реЗрдпрд░рд┐рдВрдЧ) рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓ рд░рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдХреНрд░реЙрд╕-рдУрд░рд┐рдЬрд┐рди рдЕрдиреБрд░реЛрдз (рд╡рд┐рднрд┐рдиреНрди рдбреЛрдореЗрди, рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рдпрд╛ рдкреЛрд░реНрдЯ) рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореБрдЦреНрдп рдХреЙрд░реНрд╕ рд╣реЗрдбрд░
Access-Control-Allow-Origin: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди рдореВрд▓реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИAccess-Control-Allow-Methods: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди HTTP рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИAccess-Control-Allow-Headers: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рди HTTP рд╣реЗрдбрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИAccess-Control-Allow-Credentials: рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ (рдХреБрдХреАрдЬрд╝, HTTP рдкреНрд░рдорд╛рдгреАрдХрд░рдг) рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ
ЁЯТб рдХреЙрд░реНрд╕ рд╕рдорд╛рдзрд╛рди
рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рд╕рдорд╛рдзрд╛рди
1. Express.js (Node.js):
const cors = require('cors');
app.use(cors({
origin: 'https://example.com',
methods: ['GET', 'POST'],
credentials: true
}));2. Spring Boot (Java):
@CrossOrigin(origins = "https://example.com")
@RestController
public class ApiController { ... }рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╕рдорд╛рдзрд╛рди
1. рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
// package.json (React)
"proxy": "http://localhost:3001"2. рдЬреЗрдПрд╕рдУрдПрдирдкреА (рдХреЗрд╡рд▓ рдЧреЗрдЯ):
// рд╕реАрдорд┐рдд рд▓реЗрдХрд┐рди рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди
fetch('api?callback=handleResponse')ЁЯФз рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдХреЙрд░реНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рдиреЗрдХреНрд╕реНрдЯ.рдЬреЗрдПрд╕
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/api/:path*',
headers: [
{
key: 'Access-Control-Allow-Origin',
value: '*'
}
]
}
]
}
}Nginx
location /api {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods
"GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers
"Content-Type, Authorization";
}Apache
# .htaccess
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods
"GET, POST, OPTIONS"
Header always set Access-Control-Allow-Headers
"Content-Type, Authorization"рдкрд░реНрдпрд╛рд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдХреЙрд░реНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рджреГрд╢реНрдп
- тАв рд╕рд░рд▓ рдЕрдиреБрд░реЛрдз: рдЧреЗрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рдХреЙрд░реНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
- тАв рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз: рдкреБрдЯ/рдбрд┐рд▓реАрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
- тАв рдХрд╕реНрдЯрдо рд╣реЗрдбрд░: рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
- тАв рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓: рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
- тАв рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ: рд╡рд┐рдлрд▓рддрд╛ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдЪрд╛рд░
- тАв рд╕реБрд░рдХреНрд╖рд╛ рдЬреЛрдЦрд┐рдореЛрдВ рдХреЗ рдХрд╛рд░рдг рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб (*) рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ
- тАв рдиреНрдпреВрдирддрдо рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд: рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
- тАв рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рддрд┐рдмрдВрдз: рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ
- тАв рдирд┐рдпрдорд┐рдд рд╕рдореАрдХреНрд╖рд╛: рд╕рдордп-рд╕рдордп рдкрд░ рдХреЙрд░реНрд╕ рдиреАрддрд┐рдпреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рдЕрджреНрдпрддрди рдХрд░реЗрдВ
рдХреЙрд░реНрд╕ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЯрд┐рдкреНрд╕
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдбреЗрд╡рд▓рдкрд░ рдЙрдкрдХрд░рдг
- тАв рдиреЗрдЯрд╡рд░реНрдХ рдЯреИрдм рдореЗрдВ OPTIONS рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
- тАв рдХрдВрд╕реЛрд▓ рдореЗрдВ рдХреЙрд░реНрд╕ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ
- тАв рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реЗрдбрд░реЛрдВ рдореЗрдВ рдХреЙрд░реНрд╕ рд╣реЗрдбрд░реЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг
- тАв рдХреЙрд░реНрд╕ рдЯреЗрд╕реНрдЯрд░ (рдпрд╣ рдЙрдкрдХрд░рдг)
- тАв рдкреЛрд╕реНрдЯрдореИрди (рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП)
- тАв рдХрд░реНрд▓ рдХрдорд╛рдВрдб (рд╕реАрдзреЗ рд╕рд░реНрд╡рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП)