본문 바로가기
Computer Science

HTTP OPTIONS 메서드란 무엇인가?

by 대박플머 2024. 9. 30.

웹 개발에서 HTTP는 서버와 클라이언트 간의 통신 규칙을 정의하는 프로토콜입니다. 다양한 HTTP 메서드가 있지만, 그중 잘 알려지지 않은 메서드 중 하나가 OPTIONS입니다. 이 메서드는 클라이언트가 서버에 특정 리소스에 대해 지원되는 HTTP 메서드 및 통신 옵션을 확인할 수 있도록 해주는 역할을 합니다.

이 글에서는 HTTP OPTIONS 메서드의 정의, 동작 방식, 실질적인 사용 사례 및 활용법을 알아보겠습니다. 특히, CORS와의 연관성, 서버가 OPTIONS 메서드를 처리하는 방식, 그리고 이를 어떻게 구현할 수 있는지에 대해 설명합니다.

HTTP 메서드의 개요

웹 애플리케이션에서 가장 흔히 사용되는 HTTP 메서드는 GET, POST, PUT, DELETE와 같은 메서드입니다. 이 메서드들은 각각의 특정한 역할을 수행하며, 웹 애플리케이션과 API 개발에서 매우 자주 사용됩니다. 하지만 OPTIONS는 다른 메서드와는 약간 다른 목적을 가지고 있습니다.

HTTP 메서드를 간단히 요약하면:

  • GET: 서버에서 리소스를 가져옵니다. 일반적으로 데이터를 읽을 때 사용됩니다.
  • POST: 서버에 데이터를 전송하여 새 리소스를 생성하거나 특정 작업을 수행합니다.
  • PUT: 서버에 보내는 데이터로 기존 리소스를 대체합니다.
  • DELETE: 서버의 특정 리소스를 삭제합니다.
  • PATCH: 리소스의 일부를 수정합니다.
  • OPTIONS: 서버가 지원하는 메서드와 통신 옵션을 확인합니다.

이 중에서 OPTIONS는 그 자체로 데이터를 수정하거나 조회하는 기능을 제공하지는 않지만, 서버와 클라이언트 간의 통신 설정을 사전에 확인하고 조정하는 중요한 역할을 합니다.

OPTIONS 요청의 기본 구조

HTTP OPTIONS 요청의 구조는 매우 간단합니다. 예를 들어, 클라이언트가 서버에 /api/resource라는 리소스가 어떤 메서드를 지원하는지 알고 싶을 때, 다음과 같은 요청을 보냅니다:

OPTIONS /api/resource HTTP/1.1
Host: example.com

서버는 이에 대한 응답으로, 해당 리소스가 지원하는 HTTP 메서드를 Allow 헤더에 나열하여 클라이언트에게 제공합니다:

HTTP/1.1 200 OK
Allow: GET, POST, PUT, DELETE

위의 예에서 서버는 /api/resource 경로에서 GET, POST, PUT, DELETE 메서드를 사용할 수 있음을 클라이언트에게 알립니다.

사전 요청(Preflight Request)과 CORS

OPTIONS 메서드는 주로 CORS(교차 출처 리소스 공유, Cross-Origin Resource Sharing) 상황에서 많이 사용됩니다. CORS는 클라이언트가 다른 도메인의 서버에 요청을 보낼 때 보안상의 이유로 특정 제한을 가하는 브라우저 보안 기능입니다. CORS를 우회하거나 설정하기 위해서는 서버와 클라이언트 간에 적절한 통신을 미리 설정해야 합니다.

예를 들어, 클라이언트가 자신의 도메인(https://client.example.com)이 아닌 다른 도메인(https://api.example.com)에 요청을 보내는 경우, 브라우저는 이 요청이 안전한지 확인하기 위해 사전 요청(preflight request)을 보냅니다. 이 사전 요청에서 사용되는 메서드가 바로 OPTIONS입니다.

CORS 사전 요청 예시

클라이언트가 POST 메서드를 사용하여 API에 데이터를 전송하려고 할 때, 브라우저는 먼저 사전 요청을 보냅니다. 이 요청은 OPTIONS 메서드를 사용하여 서버에 요청을 보낼 수 있는지 미리 확인합니다:

OPTIONS /api/data HTTP/1.1
Host: api.example.com
Origin: https://client.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type

서버는 이 요청에 대해 응답하면서, 클라이언트가 요청한 POST 메서드를 사용할 수 있는지 여부를 알려줍니다. 또한, CORS 헤더를 통해 이 요청이 허용되는지 명확히 합니다:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://client.example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type

이와 같은 응답이 도착하면, 브라우저는 이후의 POST 요청을 실제로 보낼 수 있습니다.

CORS 사전 요청의 중요성

이러한 사전 요청은 클라이언트와 서버 간의 신뢰성을 보장하는 중요한 역할을 합니다. 특히, 웹 보안 측면에서 OPTIONS 메서드를 사용한 사전 요청은 잠재적인 보안 위협을 줄이고, 안전한 통신을 유지하는 데 기여합니다.

OPTIONS 메서드의 실제 활용

OPTIONS 메서드는 다음과 같은 상황에서 유용하게 사용됩니다:

1. 서버에서 허용하는 메서드 확인

클라이언트가 서버에 어떤 메서드가 지원되는지 모르거나 불확실한 경우, OPTIONS 요청을 사용하여 이 정보를 쉽게 확인할 수 있습니다. 이는 서버와의 상호작용을 보다 명확하게 하고, 불필요한 오류를 방지하는 데 도움을 줍니다.

예를 들어, API를 개발하는 과정에서 특정 엔드포인트에 대해 클라이언트가 GET, POST, PUT 중 어느 메서드를 사용할 수 있는지 모를 때, OPTIONS 요청을 보내면 서버가 지원하는 메서드를 응답으로 알려줍니다.

2. 서버 상태 확인 및 설정

서버의 상태나 설정을 확인할 때에도 OPTIONS 메서드를 사용할 수 있습니다. 클라이언트가 서버와의 통신에서 어떤 메서드가 가능하며, 어떠한 통신 옵션이 지원되는지 사전에 파악할 수 있기 때문에, 서버 설정을 확인하는 중요한 도구로 사용할 수 있습니다.

3. CORS 정책 관리

위에서 설명한 것처럼 OPTIONS 메서드는 CORS 사전 요청에서 매우 중요한 역할을 합니다. 이를 통해 브라우저는 서버가 허용하는 출처, 메서드, 헤더 등을 미리 확인하고, 안전한 통신을 보장할 수 있습니다. CORS 설정이 잘못되면 클라이언트는 서버에 요청을 보내지 못하게 되기 때문에, 이 부분에서 OPTIONS 메서드는 필수적인 역할을 합니다.

OPTIONS 메서드와 RESTful API 설계

RESTful API 설계에서 OPTIONS 메서드를 사용하는 것은 API와 클라이언트 간의 상호작용을 더욱 원활하게 만듭니다. 클라이언트는 API에서 제공하는 리소스가 어떤 메서드를 지원하는지 사전에 파악함으로써, 잘못된 요청을 보내지 않도록 예방할 수 있습니다. 또한, API가 제공하는 기능과 제약을 명확히 이해할 수 있게 됩니다.

구현 예시: Node.js와 Express에서 OPTIONS 메서드 처리

다음은 Node.js와 Express를 사용하여 OPTIONS 요청을 처리하는 간단한 예시입니다:

const express = require('express');
const app = express();

app.use(express.json());

app.options('/api/resource', (req, res) => {
    res.set('Allow', 'GET, POST, PUT, DELETE');
    res.status(200).send();
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

이 코드에서는 /api/resource 경로에 대한 OPTIONS 요청이 들어오면, 서버가 해당 리소스에서 GET, POST, PUT, DELETE 메서드를 지원한다는 응답을 클라이언트에게 보냅니다.

결론

HTTP OPTIONS 메서드는 서버와 클라이언트 간의 통신 옵션과 메서드를 미리 확인할 수 있도록 해주는 중요한 메서드입니다. 특히, CORS 사전 요청에서 필수적으로 사용되며, 서버가 클라이언트 요청을 허용하는지 여부를 확인하는 데 도움을 줍니다.

RESTful API 설계나 웹 애플리케이션에서 OPTIONS 메서드를 적절하게 활용하면, 클라이언트와 서버 간의 상호작용을 보다 명확하고 효율적으로 만들 수 있습니다.