[파이썬] aiohttp CORS 처리하기

The aiohttp library is a powerful tool for building HTTP servers and clients in Python. However, when it comes to dealing with Cross-Origin Resource Sharing (CORS), aiohttp requires some additional configuration. In this blog post, we will explore how to handle CORS in aiohttp applications.

What is CORS?

CORS is a security mechanism that allows a web page from one domain to access resources from another domain. It provides a way to ensure that a client-side web application can securely interact with resources hosted on a different domain.

Without CORS, web browsers prohibit JavaScript code running on one domain from making requests to another domain. This policy is known as the Same-Origin Policy. However, by implementing the appropriate CORS headers on the server-side, we can relax this policy and allow cross-domain communication.

Enabling CORS in aiohttp

To enable CORS in aiohttp, we need to modify the HTTP response headers sent from the server. We can achieve this by using aiohttp middleware.

Here’s an example of how to enable CORS in aiohttp:

from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, world!")

async def cors_middleware(app, handler):
    async def middleware(request):
        response = await handler(request)
        response.headers['Access-Control-Allow-Origin'] = '*'
        response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
        response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
        return response
    
    return middleware

app = web.Application(middlewares=[cors_middleware])
app.router.add_get('/', handle)

if __name__ == '__main__':
    web.run_app(app)

In the above example, we define a simple handler for the root route (/). We also define a middleware function, cors_middleware, which modifies the HTTP response headers to allow cross-origin requests.

The Access-Control-Allow-Origin header is set to *, which means that any domain is allowed to access the server’s resources. You can specify a specific domain instead if needed.

The Access-Control-Allow-Methods header specifies the acceptable HTTP methods for cross-origin requests. In this example, we allow GET, POST, PUT, DELETE, and OPTIONS.

Finally, the Access-Control-Allow-Headers header specifies the list of allowed headers in the cross-origin request.

Handling Preflight Requests

When making certain types of cross-origin requests, such as those with non-simple HTTP methods (e.g., PUT, DELETE) or custom headers, the web browser first sends a preflight request to the server before making the actual request.

To handle preflight requests, we need to add an additional route in our aiohttp application.

Here’s an example of how to handle preflight requests in aiohttp:

async def preflight_handler(request):
    response = web.Response()
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE, OPTIONS'
    response.headers['Access-Control-Allow-Headers'] = 'Content-Type'
    response.headers['Access-Control-Max-Age'] = '3600'
    return response

app.router.add_options('/', preflight_handler)

In the above example, we define a new route with the OPTIONS HTTP method to handle preflight requests. The response headers are set to allow cross-origin requests, similar to the previous example.

Conclusion

Handling CORS in aiohttp applications is essential for enabling cross-domain communication between web applications. By adding the appropriate CORS headers to the server’s HTTP responses, we can ensure that our aiohttp applications can securely interact with resources hosted on different domains.

In this blog post, we explored how to enable CORS in aiohttp using middleware and how to handle preflight requests. With this knowledge, you can now incorporate CORS handling into your aiohttp projects and build more robust web applications.