āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļ”āļŠāļ­āļš CORS

āļ—āļ”āļŠāļ­āļšāđāļĨāļ°āļ”āļĩāļšāļąāļāļ™āđ‚āļĒāļšāļēāļĒ CORS (Cross-Origin Resource Sharing) āđāļĨāļ°āļ„āļģāļ‚āļ­ API

āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļģāļ‚āļ­
āļāļģāļŦāļ™āļ”āļ„āđˆāļēāļ„āļģāļ‚āļ­ API āļ‚āļ­āļ‡āļ„āļļāļ“āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļ”āļŠāļ­āļš
āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ„āļģāļ‚āļ­
āļĨāļ­āļ‡āđƒāļŠāđ‰āļ„āļģāļ‚āļ­ API āļ—āļĩāđˆāļāļģāļŦāļ™āļ”āđ„āļ§āđ‰āļĨāđˆāļ§āļ‡āļŦāļ™āđ‰āļēāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰
āļ‚āđ‰āļ­āļĄāļđāļĨ CORS
āļ‚āđ‰āļ­āļĄāļđāļĨāļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš CORS

CORS āļ„āļ·āļ­āļ­āļ°āđ„āļĢ? CORS (Cross-Origin Resource Sharing) āđ€āļ›āđ‡āļ™āļāļĨāđ„āļāļ—āļĩāđˆāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļ§āđ‡āļšāđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒāļŠāļĢāđ‰āļēāļ‡āļ„āļģāļ‚āļ­āļ‚āđ‰āļēāļĄāļ•āđ‰āļ™āļ—āļēāļ‡ (āđ‚āļ”āđ€āļĄāļ™, āđ‚āļ›āļĢāđ‚āļ•āļ„āļ­āļĨ āļŦāļĢāļ·āļ­āļžāļ­āļĢāđŒāļ•āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™) āļˆāļēāļāļŠāļ„āļĢāļīāļ›āļ•āđŒāļ—āļĩāđˆāļ—āļģāļ‡āļēāļ™āđƒāļ™āđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒ

āļŠāđˆāļ§āļ™āļŦāļąāļ§ CORS āļ—āļĩāđˆāļŠāļģāļ„āļąāļ

  • Access-Control-Allow-Origin: āļĢāļ°āļšāļļāļ§āđˆāļēāļ•āđ‰āļ™āļ—āļēāļ‡āđƒāļ”āđ„āļ”āđ‰āļĢāļąāļšāļ­āļ™āļļāļāļēāļ•āđƒāļŦāđ‰āđ€āļ‚āđ‰āļēāļ–āļķāļ‡āļ—āļĢāļąāļžāļĒāļēāļāļĢ
  • Access-Control-Allow-Methods: āļĢāļ°āļšāļļāļ§āđˆāļēāļ§āļīāļ˜āļĩāļāļēāļĢ HTTP āđƒāļ”āđ„āļ”āđ‰āļĢāļąāļšāļ­āļ™āļļāļāļēāļ•
  • Access-Control-Allow-Headers: āļĢāļ°āļšāļļāļ§āđˆāļēāļŠāđˆāļ§āļ™āļŦāļąāļ§ HTTP āđƒāļ”āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ„āļ”āđ‰
  • Access-Control-Allow-Credentials: āļĢāļ°āļšāļļāļ§āđˆāļēāļˆāļ°āļĢāļ§āļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļąāļšāļĢāļ­āļ‡ (āļ„āļļāļāļāļĩāđ‰, āļāļēāļĢāļĢāļąāļšāļĢāļ­āļ‡āļ„āļ§āļēāļĄāļ–āļđāļāļ•āđ‰āļ­āļ‡ HTTP) āļŦāļĢāļ·āļ­āđ„āļĄāđˆ

ðŸ’Ą āđ‚āļ‹āļĨāļđāļŠāļąāļ™ CORS

āđ‚āļ‹āļĨāļđāļŠāļąāļ™āļāļąāđˆāļ‡āđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒ

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. JSONP (āđ€āļ‰āļžāļēāļ° GET):

// āđ‚āļ‹āļĨāļđāļŠāļąāļ™āļ—āļĩāđˆāļˆāļģāļāļąāļ”āđāļ•āđˆāđ€āļĢāļĩāļĒāļšāļ‡āđˆāļēāļĒ
          fetch('api?callback=handleResponse')

🔧 āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē CORS āļ•āļēāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ

Next.js

// 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"

āļāļēāļĢāļāļģāļŦāļ™āļ”āļ„āđˆāļē CORS āļ•āļēāļĄāļŠāļ āļēāļžāđāļ§āļ”āļĨāđ‰āļ­āļĄ

āļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļāļēāļĢāļ—āļ”āļŠāļ­āļš

  • â€Ē āļ„āļģāļ‚āļ­āđāļšāļšāļ‡āđˆāļēāļĒ: āļ—āļ”āļŠāļ­āļšāļžāļĪāļ•āļīāļāļĢāļĢāļĄ CORS āļžāļ·āđ‰āļ™āļāļēāļ™āļ”āđ‰āļ§āļĒāļ„āļģāļ‚āļ­ GET
  • â€Ē āļ„āļģāļ‚āļ­ Preflight: āļ—āļ”āļŠāļ­āļšāļ„āļģāļ‚āļ­ preflight āļ”āđ‰āļ§āļĒāļ§āļīāļ˜āļĩāļāļēāļĢ PUT/DELETE
  • â€Ē āļŠāđˆāļ§āļ™āļŦāļąāļ§āđāļšāļšāļāļģāļŦāļ™āļ”āđ€āļ­āļ‡: āļ—āļ”āļŠāļ­āļšāļ„āļģāļ‚āļ­āļ”āđ‰āļ§āļĒāļŠāđˆāļ§āļ™āļŦāļąāļ§ Authorization
  • â€Ē āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļąāļšāļĢāļ­āļ‡: āļ—āļ”āļŠāļ­āļšāļ„āļģāļ‚āļ­āļ”āđ‰āļ§āļĒāļ„āļļāļāļāļĩāđ‰
  • â€Ē āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”: āļ—āļ”āļŠāļ­āļšāļŠāļ–āļēāļ™āļāļēāļĢāļ“āđŒāļ„āļ§āļēāļĄāļĨāđ‰āļĄāđ€āļŦāļĨāļ§

āļ‚āđ‰āļ­āļ„āļ§āļĢāļžāļīāļˆāļēāļĢāļ“āļēāļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ

  • â€Ē āļĢāļ°āļĄāļąāļ”āļĢāļ°āļ§āļąāļ‡āļāļēāļĢāđƒāļŠāđ‰ wildcard (*) āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ
  • â€Ē āļŦāļĨāļąāļāļāļēāļĢāļŠāļīāļ—āļ˜āļīāđŒāļ‚āļąāđ‰āļ™āļ•āđˆāļģ: āļ­āļ™āļļāļāļēāļ•āđ€āļ‰āļžāļēāļ°āļ•āđ‰āļ™āļ—āļēāļ‡āđāļĨāļ°āļ§āļīāļ˜āļĩāļāļēāļĢāļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™āđ€āļ—āđˆāļēāļ™āļąāđ‰āļ™
  • â€Ē āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļąāļšāļĢāļ­āļ‡: āļ­āļ™āļļāļāļēāļ•āđ€āļ‰āļžāļēāļ°āļ•āđ‰āļ™āļ—āļēāļ‡āļ—āļĩāđˆāļĢāļ°āļšāļļāđ€āļĄāļ·āđˆāļ­āļĢāļ§āļĄāļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļąāļšāļĢāļ­āļ‡
  • â€Ē āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ›āļāļ•āļī: āļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĨāļ°āļ­āļąāļ›āđ€āļ”āļ•āļ™āđ‚āļĒāļšāļēāļĒ CORS āđ€āļ›āđ‡āļ™āļĢāļ°āļĒāļ°

āđ€āļ„āļĨāđ‡āļ”āļĨāļąāļšāļāļēāļĢāļ”āļĩāļšāļąāļ CORS

āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŠāļģāļŦāļĢāļąāļšāļ™āļąāļāļžāļąāļ’āļ™āļēāđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒ

  • â€Ē āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ„āļģāļ‚āļ­ OPTIONS āđƒāļ™āđāļ—āđ‡āļš Network
  • â€Ē āļĄāļ­āļ‡āļŦāļēāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ” CORS āđƒāļ™ Console
  • â€Ē āļ•āļĢāļ§āļˆāļŠāļ­āļšāļŠāđˆāļ§āļ™āļŦāļąāļ§ CORS āđƒāļ™ Response Headers

āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļĄāļĩāļ›āļĢāļ°āđ‚āļĒāļŠāļ™āđŒ

  • â€Ē āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļ”āļŠāļ­āļš CORS (āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ™āļĩāđ‰)
  • â€Ē Postman (āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļ”āļŠāļ­āļš API)
  • â€Ē āļ„āļģāļŠāļąāđˆāļ‡ curl (āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļ”āļŠāļ­āļšāđ€āļ‹āļīāļĢāđŒāļŸāđ€āļ§āļ­āļĢāđŒāđ‚āļ”āļĒāļ•āļĢāļ‡)