Bird
Raised Fist0
Ruby on Railsframework~8 mins

CORS configuration in Ruby on Rails - Performance & Optimization

Choose your learning style10 modes available
Performance: CORS configuration
MEDIUM IMPACT
CORS configuration affects the browser's ability to load resources from different origins, impacting page load speed and interaction readiness.
Allowing cross-origin requests for API resources
Ruby on Rails
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://trusted.example.com'
    resource '/api/*', headers: :any, methods: [:get, :post, :options]
  end
end
Restricting origins and resource paths reduces unnecessary preflight requests and network overhead, improving load speed and security.
📈 Performance GainEliminates many preflight requests, reducing network latency and speeding up LCP.
Allowing cross-origin requests for API resources
Ruby on Rails
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*', headers: :any, methods: [:get, :post, :options]
  end
end
Using a wildcard '*' for origins allows all domains, triggering preflight requests and potential security risks, which can slow down loading.
📉 Performance CostTriggers preflight OPTIONS requests for every cross-origin call, adding network latency and blocking rendering until response.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Wildcard origins with broad resource accessMinimal0Low but delayed by network[X] Bad
Restricted origins and resource pathsMinimal0Low and fast[OK] Good
Rendering Pipeline
CORS configuration affects the browser's network request phase before rendering. If misconfigured, it causes extra preflight requests that delay resource loading and block rendering.
→Network Request
→Resource Loading
→Rendering
⚠️ BottleneckNetwork Request due to preflight OPTIONS calls
Core Web Vital Affected
LCP
CORS configuration affects the browser's ability to load resources from different origins, impacting page load speed and interaction readiness.
Optimization Tips
1Avoid using '*' wildcard for origins in production CORS settings.
2Limit resource paths and HTTP methods allowed for cross-origin requests.
3Use DevTools Network tab to monitor and minimize preflight OPTIONS requests.
Performance Quiz - 3 Questions
Test your performance knowledge
What impact does using a wildcard '*' for origins in CORS have on page load?
AIt has no effect on performance.
BIt reduces network requests and speeds up loading.
CIt triggers many preflight requests, increasing load time.
DIt blocks all cross-origin requests.
DevTools: Network
How to check: Open DevTools, go to Network tab, filter by OPTIONS method, and observe preflight requests for cross-origin calls.
What to look for: Look for many OPTIONS requests before actual resource loads; fewer or no OPTIONS requests indicate better CORS performance.

Practice

(1/5)
1. What is the main purpose of configuring CORS in a Rails application?
easy
A. To speed up database queries
B. To control which external websites can access your app's resources
C. To manage user sessions securely
D. To style the frontend pages

Solution

  1. Step 1: Understand CORS role

    CORS (Cross-Origin Resource Sharing) controls access from other websites to your app's resources.
  2. Step 2: Identify main purpose

    It restricts or allows external origins to make requests, enhancing security.
  3. Final Answer:

    To control which external websites can access your app's resources -> Option B
  4. Quick Check:

    CORS controls access = B [OK]
Hint: Remember CORS is about cross-site access control [OK]
Common Mistakes:
  • Confusing CORS with database or session management
  • Thinking CORS affects frontend styling
  • Assuming CORS speeds up app performance
2. Which of the following is the correct way to add CORS middleware in a Rails app initializer?
easy
A. Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post] end end
B. Rails.middleware.use Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post] end end
C. config.middleware.add Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post] end end
D. Rails.application.middleware.insert_after 0, Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post] end end

Solution

  1. Step 1: Recall correct middleware insertion

    In Rails, middleware is added using Rails.application.config.middleware.insert_before or insert_after.
  2. Step 2: Identify correct syntax

    The common pattern is insert_before 0, Rack::Cors with a block for configuration.
  3. Final Answer:

    Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post] end end -> Option A
  4. Quick Check:

    Use insert_before 0 with config.middleware = C [OK]
Hint: Use Rails.application.config.middleware.insert_before 0 for CORS [OK]
Common Mistakes:
  • Using Rails.middleware instead of Rails.application.config.middleware
  • Using insert_after instead of insert_before 0
  • Missing config in middleware insertion
3. Given this CORS config in Rails initializer:
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://example.com'
    resource '*', headers: :any, methods: [:get, :post]
  end
end
What happens if a request comes from 'https://evil.com'?
medium
A. The request is blocked due to origin mismatch
B. The request causes a server error
C. The request is allowed but only GET method works
D. The request is allowed with all headers and methods

Solution

  1. Step 1: Analyze allowed origins

    The config allows only 'https://example.com' origin.
  2. Step 2: Check request origin

    Request from 'https://evil.com' is not in allowed origins, so it is blocked by CORS policy.
  3. Final Answer:

    The request is blocked due to origin mismatch -> Option A
  4. Quick Check:

    Origin not allowed = request blocked = D [OK]
Hint: Only origins listed in config are allowed [OK]
Common Mistakes:
  • Assuming wildcard '*' allows all origins when specific origins set
  • Thinking request causes server error instead of CORS block
  • Confusing allowed methods with allowed origins
4. You wrote this CORS config:
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*', headers: :any, methods: [:get, :post, :put]
  end
end
But PUT requests from frontend are failing with CORS errors. What is the likely problem?
medium
A. The methods list is missing :put
B. The frontend is not sending the correct Origin header
C. The server needs to allow OPTIONS method for preflight
D. The origins '*' is too restrictive

Solution

  1. Step 1: Check methods allowed

    PUT is included in methods, so it's not missing.
  2. Step 2: Understand CORS preflight

    PUT requests trigger a preflight OPTIONS request which must be allowed by server.
  3. Step 3: Identify missing OPTIONS method

    OPTIONS method is not listed, so preflight fails causing CORS error.
  4. Final Answer:

    The server needs to allow OPTIONS method for preflight -> Option C
  5. Quick Check:

    Preflight OPTIONS missing = CORS fail = A [OK]
Hint: Always allow OPTIONS method for CORS preflight [OK]
Common Mistakes:
  • Forgetting to allow OPTIONS method
  • Assuming '*' origin is restrictive
  • Blaming frontend Origin header without checking server
5. You want to allow CORS only for two trusted domains: 'https://app1.com' and 'https://app2.com'. Which config correctly implements this securely in Rails?
hard
A. Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'app1.com' resource '*', headers: :any, methods: [:get, :post, :options] end allow do origins 'app2.com' resource '*', headers: :any, methods: [:get, :post, :options] end end
B. Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: :any end end
C. Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'app1.com', 'app2.com' resource '*', headers: :any, methods: [:get, :post] end end
D. Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'https://app1.com', 'https://app2.com' resource '*', headers: :any, methods: [:get, :post, :options] end end

Solution

  1. Step 1: Identify correct origins format

    Origins must include full URLs with protocol for security, so 'https://app1.com' and 'https://app2.com' are correct.
  2. Step 2: Check methods and resource

    Allowing common methods including OPTIONS for preflight is necessary.
  3. Step 3: Compare options

    Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'https://app1.com', 'https://app2.com' resource '*', headers: :any, methods: [:get, :post, :options] end end correctly lists both origins in one allow block with proper methods and full URLs.
  4. Final Answer:

    Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins 'https://app1.com', 'https://app2.com' resource '*', headers: :any, methods: [:get, :post, :options] end end -> Option D
  5. Quick Check:

    Trusted full origins with methods including OPTIONS = A [OK]
Hint: List full trusted origins with needed methods including OPTIONS [OK]
Common Mistakes:
  • Using '*' origin which is insecure
  • Omitting protocol in origins
  • Not allowing OPTIONS method for preflight
  • Splitting origins into multiple allow blocks unnecessarily
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard