사전 OPTIONS
인터페이스

OPTIONS

gabury1고친 사람 github-actions[bot]

OPTIONS 는 웹 서버에 이 주소로 무엇을 할 수 있는지 미리 물어보는 요청 방법입니다. 서버는 그 주소가 받아 주는 요청 방법의 목록을 답으로 돌려줍니다. 브라우저가 다른 사이트의 서버로 요청을 보내기 전에 허락을 구할 때도 이 방법을 씁니다. 명령줄 도구에서 말하는 「옵션」은 이름만 같은 다른 것입니다.

쉽고 빠른 이해

OPTIONS 는 대상을 건드리지 않고 그 대상에 걸린 규칙만 묻는 요청입니다. 게시글 주소에 OPTIONS 를 보내면 그 주소가 읽기만 받아 주는지 지우기도 받아 주는지가 돌아옵니다.

이게 없으면 받아 주는지 아닌지를 알아보려고 진짜 요청을 한 번 보내 봐야 합니다. 지우기를 시험 삼아 보낼 수는 없습니다.

요청 방법을 웹에서는 메서드라고 부릅니다.

어떻게 도나:

  1. 클라이언트가 알아보고 싶은 주소로 OPTIONS 를 보냅니다
  2. 서버는 그 주소가 받아 주는 메서드를 목록으로 만듭니다
  3. 그 목록을 Allow 헤더에 담아 보내고 내용물은 안 붙입니다

대가도 있습니다. 물어보는 요청이 한 번 더 오가므로 왕복이 늘어납니다. 그리고 받아 준다는 답이 그 요청이 성공한다는 뜻은 아닙니다. 권한이 모자라면 여전히 거절당합니다.

상세

OPTIONS 는 HTTP(HyperText Transfer Protocol, 하이퍼텍스트 전송 프로토콜)의 요청 메서드 가운데 하나입니다. 요청 메서드는 요청이 서버에게 무엇을 해 달라는 것인지 알리는 낱말입니다. OPTIONS 는 그 가운데 「무엇을 할 수 있는지 알려 달라」에 해당합니다.

다른 메서드는 대상을 가지고 무언가를 합니다. GET 은 내용을 가져오고 PUT 은 올려 두고 DELETE 는 지웁니다. OPTIONS 만 대상을 그대로 둔 채 그 대상에 걸린 규칙을 묻습니다.

그래서 이 요청은 답을 받아도 서버에 남는 것이 없습니다. 몇 번을 보내든 게시글은 지워지지도 바뀌지도 않습니다.

Allow 헤더의 허용 목록

가장 짧은 OPTIONS 요청은 메서드와 주소만 있습니다. 무엇을 알아볼지는 주소가 이미 말하므로 본문이 필요 없습니다.

http
OPTIONS /posts/42 HTTP/1.1
Host: example.com

서버는 그 주소가 받아 주는 메서드를 Allow 헤더에 담아 돌려줍니다. Allow 는 이름 그대로 허용 목록을 적는 헤더입니다. 이름은 쉼표로 잇습니다.

http
HTTP/1.1 204 No Content
Allow: GET, HEAD, PUT, DELETE, OPTIONS

이 답을 읽은 클라이언트는 /posts/42 에 지우기를 보내도 된다는 것을 압니다. 목록에 없는 메서드를 보내면 405 Method Not Allowed 가 돌아온다는 것도 미리 압니다.

명령 한 줄로 확인할 때는 curl 에 메서드 이름을 직접 줍니다.

터미널
curl -X OPTIONS -i example.com/a  # 허용 목록만 온다

별표 하나로 서버 전체에 묻기

주소 자리에 * 만 적는 꼴이 따로 있습니다. 이때 질문의 대상은 개별 자원이 아니라 서버 자신입니다.

http
OPTIONS * HTTP/1.1
Host: example.com

「이 서버가 어떤 방식으로 말을 받나」를 묻는 요청입니다. 특정 게시글이나 파일과는 상관이 없습니다. 서버가 아직 살아 있는지 확인하는 용도로도 쓰입니다.

브라우저가 미리 물어보는 요청

실무에서 OPTIONS 를 가장 자주 만나는 곳은 브라우저입니다. 웹 페이지를 내려준 그 주소를 출처라고 부릅니다. 페이지가 자기 출처가 아닌 다른 서버로 요청을 보내려 할 때, 브라우저는 그 요청을 바로 보내지 않습니다.

브라우저가 이런 요청을 막는 규칙이 동일 출처 정책입니다.

그 막힌 길을 서버의 허락을 받아 여는 방법이 CORS(Cross-Origin Resource Sharing, 교차 출처 자원 공유)입니다.

허락을 받는 절차 가운데 하나가 OPTIONS 를 먼저 보내는 것입니다. 이 확인 요청을 프리플라이트 요청이라고 부릅니다.

sequenceDiagram
    participant 브라우저
    participant 서버
    브라우저->>서버: OPTIONS · 지우기를 보내도 되나
    서버-->>브라우저: 허용하는 메서드
    Note over 브라우저: 허락에 없으면 여기서 끝난다
    브라우저->>서버: DELETE · 진짜 요청
    서버-->>브라우저: 처리 결과

그림은 왕복이 두 번이라는 점을 보입니다. 첫 왕복에서 서버가 지우기를 허락하지 않으면 둘째 왕복은 아예 나가지 않습니다. 코드가 받는 것은 브라우저가 만든 오류입니다. 서버는 진짜 요청을 구경도 못 합니다.

이 OPTIONS 는 개발자가 코드로 보내는 것이 아니라 브라우저가 스스로 끼워 넣습니다. 서버가 OPTIONS 를 막아 두면 그 서버로 가는 다른 출처의 요청이 통째로 실패합니다. 로그인 검사 같은 것을 OPTIONS 에까지 걸면 같은 일이 벌어집니다.

안전성과 멱등성

OPTIONS 는 안전한 메서드입니다. 안전한 메서드는 서버에 남는 상태를 바꿔 달라고 하지 않는 메서드입니다. 크롤러처럼 사람이 누르지 않아도 요청을 보내는 도구가 이 메서드를 마음껏 뿌려도 데이터는 사라지지 않습니다.

멱등하기도 합니다. 멱등하다는 것은 같은 요청을 여러 번 보내도 서버에 남는 효과가 한 번 보낸 것과 같다는 뜻입니다. 상태를 아예 안 바꾸는 메서드라면 멱등은 저절로 따라옵니다.

이 두 성질 덕분에 재시도가 쉽습니다. 응답이 오다 끊겨도 그냥 한 번 더 보내면 됩니다.

요구별로 고르는 메서드

「이 주소를 건드려 보고 싶다」는 요구는 여럿입니다. 그때마다 맞는 메서드가 다릅니다.

하려는 일 고르는 것
이 주소가 받아 주는 메서드 확인 OPTIONS
다른 출처로 보내기 전 허락 받기 OPTIONS
내용물은 빼고 크기와 형식만 확인 HEAD
서버가 주는 기능 전체를 사람이 읽기 별도 문서

앞의 둘이 OPTIONS 의 몫입니다. 셋째는 대상의 내용물에 관한 질문이라 HEAD 가 받습니다.

넷째 줄이 자주 헷갈리는 대목입니다. OPTIONS 가 알려 주는 것은 메서드 이름 몇 개뿐입니다. 어떤 값을 넣어야 하는지도 무엇이 돌아오는지도 안 나옵니다. 그 설명은 사람이 읽는 문서가 따로 맡습니다.

명령줄 옵션과 가르기

프로그램을 실행할 때 붙이는 -v 나 --verbose 같은 것도 옵션이라고 부릅니다. 이쪽은 요청이 아니라 명령의 부속입니다. 주고받는 상대가 없습니다.

두 낱말은 영어 어원만 같습니다. OPTIONS 는 클라이언트가 서버로 보내는 요청 메서드 하나입니다. 언제나 대문자로 적습니다.

관련 항목

OPTIONS 와 나란히 서는 요청 메서드

요청 메서드 · GET · HEAD · POST · PUT · PATCH · DELETE · CONNECT · TRACE

OPTIONS 가 지키는 성질

안전한 메서드 · 멱등성 · 안전하지 않은 메서드 · 재시도

OPTIONS 응답에 실려 오는 헤더

헤더 · Allow · Access-Control-Allow-Methods · Access-Control-Allow-Headers · Access-Control-Allow-Origin · Access-Control-Max-Age · Content-Length

브라우저가 OPTIONS 를 끼워 넣게 만드는 규칙

CORS · 프리플라이트 요청 · 동일 출처 정책 · 출처 · 단순 요청 · 자격 증명

OPTIONS 응답에 오는 상태 코드

상태 코드 · 200 OK · 204 No Content · 404 Not Found · 405 Method Not Allowed · 501 Not Implemented

OPTIONS 가 가리키는 대상과 그 주소

자원 · URI · 요청 대상 · 오리진 서버 · 본문

OPTIONS 요청이 지나가는 중간 장비

프록시 · 리버스 프록시 · 로드 밸런서 · API 게이트웨이 · CDN

OPTIONS 를 정의하는 표준·문서

HTTP · HTTP/1.1 · HTTP/2 · RFC 9110

OPTIONS 없이 통신 규칙을 알리는 다른 수단

OpenAPI · HATEOAS · WebDAV · 서비스 디스커버리

OPTIONS 를 받아 처리하는 서버 쪽 구성 요소

웹 서버 · 라우팅 · 미들웨어 · curl

이름이 겹치는 이웃

명령줄 옵션 · 소켓 옵션 · TCP 옵션 · 컴파일 옵션

다른 이름: OPTIONS 메서드 · HTTP OPTIONS