REST API
한눈에 보기
REST는 HTTP의 설계 의도를 활용해 자원을 URI로 식별하고 메서드로 행위를 표현하는 아키텍처 스타일이다. 여섯 가지 제약 조건과 URI 설계 원칙, 버전 관리, GraphQL과 gRPC와의 비교를 정리한다.
최종 업데이트 2026.09.17
REST(Representational State Transfer)는 HTTP의 설계 의도를 그대로 활용해 분산 시스템을 만드는 아키텍처 스타일이며, REST API는 이 원칙에 따라 자원(Resource)을 URI(Uniform Resource Identifier)로 식별하고 HTTP 메서드로 행위를 표현하는 API를 말한다. 핵심은 무엇을(자원) URI에, 어떻게(행위) 메서드에 나누어 담는 역할 분리이며, 이 규약 덕분에 클라이언트와 서버가 서로의 내부 구현을 몰라도 일관된 방식으로 소통할 수 있다.
REST의 제약 조건
REST는 로이 필딩(Roy Fielding)의 박사 논문에서 정리된 여섯 가지 제약 조건으로 정의된다. 클라이언트-서버 구조는 화면과 데이터 저장의 관심사를 분리해 독립적인 진화를 가능하게 한다. 무상태(Stateless)는 각 요청이 처리에 필요한 정보를 전부 담아야 하고 서버가 클라이언트의 상태를 세션처럼 기억하지 않아야 한다는 제약으로, 어느 서버가 받아도 같은 결과가 나오므로 수평 확장이 쉬워진다. 캐시 가능(Cacheable)은 응답에 캐시 가능 여부를 명시해 중간 계층이 응답을 재사용할 수 있게 한다. 계층화 시스템(Layered System)은 클라이언트가 최종 서버에 직접 붙었는지 프록시를 거쳤는지 알 필요가 없게 한다. 균일한 인터페이스(Uniform Interface)는 자원 식별, 표현을 통한 조작, 자기 서술적 메시지, HATEOAS(Hypermedia as the Engine of Application State)를 포함하는 가장 REST다운 제약이다. 마지막으로 주문형 코드(Code on Demand)는 선택 사항이다. 실무 API 대부분은 HATEOAS까지 지키지 않으므로, 엄밀한 의미의 REST가 아니라 REST 스타일을 따르는 HTTP API라고 부르는 것이 정확하다는 논점도 알아 둘 만하다.
자원 중심 URI와 메서드 설계
REST 설계의 첫 규칙은 URI에 동사가 아니라 명사를 쓰는 것이다. 행위는 메서드가 표현한다.
좋은 설계
GET /users 사용자 목록 조회
POST /users 사용자 생성
GET /users/42 42번 사용자 조회
PATCH /users/42 42번 사용자 부분 수정
DELETE /users/42 42번 사용자 삭제
GET /users/42/orders 42번 사용자의 주문 목록
나쁜 설계
GET /getUserList
POST /deleteUser?id=42
컬렉션은 복수형 명사로, 개별 자원은 식별자를 붙인 경로로 표현하고, 소속 관계는 계층 경로로 나타낸다. 필터링, 정렬, 페이지네이션(Pagination)은 경로가 아니라 쿼리 문자열로 처리한다. 예를 들어 GET /articles?category=web&sort=latest&page=2처럼 쓴다. 상태 변경 결과는 상태 코드로 알린다. 생성엔 201 Created와 Location 헤더, 본문 없는 성공엔 204 No Content, 잘못된 요청엔 400, 권한 문제엔 401과 403을 구분해 쓰는 것이 표준적인 조합이다. 검색처럼 자원 개념에 딱 맞지 않는 행위는 POST /orders/42/cancel처럼 행위를 하위 자원으로 모델링하는 실용적 절충이 흔히 쓰인다.
버전 관리와 문서화, 그리고 실무 관심사
공개 API는 하위 호환을 깨는 변경에 대비해 버전 전략이 필요하다. URI에 버전을 넣는 /v1/users 방식이 가장 흔하고, 헤더로 버전을 협상하는 방식도 있다. 응답 형식은 JSON(JavaScript Object Notation)이 사실상 표준이며, 오류 응답은 상태 코드와 함께 기계가 해석할 수 있는 오류 코드와 사람이 읽을 메시지를 일관된 구조로 담는 것이 좋다. API 명세는 OpenAPI 명세(OpenAPI Specification)로 작성해 문서와 클라이언트 코드 생성, 테스트를 자동화하는 것이 현재 관행이고, 스웨거(Swagger) 도구군이 널리 쓰인다. 이 밖에 무상태 원칙과 짝을 이루는 토큰 기반 인증, 과도한 호출을 제어하는 사용량 제한(Rate Limiting), 브라우저 교차 출처 호출을 위한 CORS(Cross-Origin Resource Sharing) 설정이 실무 설계의 단골 관심사다.
다른 API 스타일과의 비교
| 구분 | REST | GraphQL | gRPC |
|---|---|---|---|
| 요청 단위 | 자원별 엔드포인트 | 단일 엔드포인트에 질의 | 서비스의 프로시저 호출 |
| 응답 형태 | 서버가 정한 표현 | 클라이언트가 필드 선택 | 프로토콜 버퍼 직렬화 |
| 강점 | 단순함, HTTP 캐시 활용 | 과다 조회와 과소 조회 해소 | 고성능, 스트리밍, 타입 계약 |
| 주 용도 | 공개 API, 일반 웹 서비스 | 화면 요구가 다양한 클라이언트 | 내부 마이크로서비스 통신 |
REST는 단순하고 HTTP 인프라와 궁합이 좋아 기본 선택지로 남아 있고, 화면마다 필요한 데이터 조합이 크게 다르면 GraphQL이, 내부 서비스 간 고성능 통신에는 gRPC가 보완재로 쓰인다.
면접에서 이렇게 물어본다
- REST의 여섯 가지 제약 조건 중 무상태가 확장성에 주는 이점을 설명해 보라.
- RESTful한 URI 설계 원칙을 나쁜 예와 대비해 설명해 보라.
- 실무 API 대부분이 엄밀한 REST가 아니라는 지적의 근거는 무엇인가.
- API 버전 관리 전략에는 어떤 것이 있고 각각의 장단점은 무엇인가.
- REST와 GraphQL은 각각 어떤 상황에서 적합한가.
웹에서 같이 읽기
- 웹 인증 방식 총정리 (Authentication)웹 서비스의 인증은 요청을 보낸 사용자가 누구인지 확인하는 절차다. HTTP는 무상태 프로토콜이므로 로그인 이후 요청마다 사용자를 식별할 수단이 필요하며, 세션, 토큰, API 키, OAuth를 비교해 각 방식의 적합한 상황을 정리한다.
- 쿠키와 세션 (Cookie, Session)쿠키는 서버가 브라우저에 저장하도록 지시하는 작은 키와 값의 쌍이고, 세션은 쿠키를 운반 수단으로 삼아 사용자별 상태를 서버 저장소에 보관하는 기법이다. 두 개념의 동작 원리와 보안 속성, 위협 대응을 다룬다.
- CSR과 SSR (Client Side Rendering, Server Side Rendering)CSR은 브라우저가 자바스크립트로 화면을 그리는 방식, SSR은 서버가 완성된 HTML을 내려보내는 방식이다. 초기 로딩, SEO, 서버 부하 관점의 차이와 SSG, ISR을 포함한 혼합 전략까지 정리한다.
- CSRF와 XSS (Cross Site Request Forgery, Cross Site Scripting)XSS는 공격자의 스크립트를 피해자 브라우저에서 실행시키는 공격이고, CSRF는 로그인된 브라우저를 속여 피해자 명의의 요청을 보내는 공격이다. 두 공격이 악용하는 신뢰 관계의 차이와 방어 수단을 정리한다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기