CORS configuration in Supabase - Time & Space Complexity
When setting up CORS (Cross-Origin Resource Sharing) in Supabase, it's important to know how the number of allowed origins affects the system.
We want to understand how the time to check permissions grows as we add more origins.
Analyze the time complexity of checking CORS origins during an API request.
// Allowed origins configured in Supabase dashboard (Settings > API > CORS)
const allowedOrigins = [
'https://example1.com',
'https://example2.com',
// ... more origins
];
// On each incoming request, check if origin is allowed
const requestOrigin = req.headers.get('origin') || '';
const isAllowed = allowedOrigins.includes(requestOrigin);
This example shows the allowed origins list and the check performed on each request.
Identify the API calls, resource provisioning, data transfers that repeat.
- Primary operation: Checking if the request origin is in the allowed origins list.
- How many times: Once per incoming API request.
Each request checks the origin against the list of allowed origins one by one.
| Input Size (n) | Approx. Checks per Request |
|---|---|
| 10 | 10 |
| 100 | 100 |
| 1000 | 1000 |
Pattern observation: The number of checks grows directly with the number of allowed origins.
Time Complexity: O(n)
This means the time to check if an origin is allowed grows linearly with the number of origins configured.
[X] Wrong: "Checking CORS origins happens instantly no matter how many origins there are."
[OK] Correct: Each origin must be checked one by one, so more origins mean more checks and longer time.
Understanding how configuration size affects request handling time shows you can think about real system performance and scalability.
"What if allowed origins were stored in a fast lookup structure like a hash set? How would the time complexity change?"
Practice
Solution
Step 1: Understand CORS purpose
CORS stands for Cross-Origin Resource Sharing and controls which websites can send requests to your backend.Step 2: Apply to Supabase context
In Supabase, CORS settings define allowed origins that can communicate with your backend securely.Final Answer:
Which websites can access your Supabase backend -> Option BQuick Check:
CORS controls access origins [OK]
- Confusing CORS with database speed
- Thinking CORS changes UI colors
- Assuming CORS affects storage size
Solution
Step 1: Understand allowed origins format
Allowed origins must include the full scheme (https://) and domain to be valid.Step 2: Match correct origin
Only 'https://example.com' matches the requirement exactly; '*' allows all origins, which is insecure.Final Answer:
Set allowed origins to ['https://example.com'] -> Option AQuick Check:
Use full URL with https [OK]
- Using '*' which allows all origins
- Omitting https:// in origin
- Using only domain without scheme
{ allowedOrigins: ['https://app.com'], allowedMethods: ['GET', 'POST'] }, what happens if a browser sends a DELETE request from https://app.com?Solution
Step 1: Check allowed origins
The origin 'https://app.com' is allowed, so origin is not the issue.Step 2: Check allowed methods
Only 'GET' and 'POST' methods are allowed; 'DELETE' is not permitted.Final Answer:
Request is blocked due to method not allowed -> Option DQuick Check:
Method not in allowedMethods [OK]
- Assuming origin blocks the request
- Thinking DELETE is allowed by default
- Believing request is allowed with warning
allowedOrigins: ['https://myapp.com'] but your frontend at https://myapp.com still gets CORS errors. What is the likely mistake?Solution
Step 1: Verify exact origin match
CORS requires exact match including scheme, domain, and port if any.Step 2: Check frontend URL correctness
If frontend URL differs (e.g., with www or port), it must be added exactly in allowedOrigins.Final Answer:
You did not add the frontend URL exactly as it appears -> Option CQuick Check:
Exact origin match needed [OK]
- Assuming '*' fixes errors
- Using http instead of https incorrectly
- Ignoring subdomains or ports in origin
Solution
Step 1: Avoid using '*' for security
Using '*' allows all origins, which is insecure for private apps.Step 2: Specify exact allowed origins
List both 'https://app.example.com' and 'https://admin.example.com' to allow only these trusted sites.Step 3: Use correct scheme https
Use 'https://' to match secure frontend URLs exactly.Final Answer:
allowedOrigins: ['https://app.example.com', 'https://admin.example.com'] -> Option AQuick Check:
List exact secure origins [OK]
- Using '*' which is insecure
- Using only base domain without subdomains
- Using http instead of https
Ready to prove it?
Pass the test and this pattern moves unknown
