RESTful 웹 서비스
1. 개요
1. 개요
RESTful 웹 서비스는 로이 필딩이 2000년에 발표한 박사 논문에서 제안한 아키텍처 스타일인 REST를 따르는 웹 서비스를 의미한다. 이는 분산 하이퍼미디어 시스템 설계를 위한 원칙의 집합으로, 월드 와이드 웹의 기본 설계 철학을 API 설계에 적용하여 웹의 장점을 최대한 활용할 수 있도록 한다.
RESTful 웹 서비스의 핵심은 자원을 URI로 식별하고, HTTP 프로토콜의 표준 메서드를 사용하여 해당 자원에 대한 조작을 정의하는 데 있다. 이를 통해 서비스 간의 상호운용성을 높이고, 캐싱과 같은 웹 인프라의 이점을 살릴 수 있으며, 클라이언트-서버 구조를 명확히 분리하여 확장성을 보장한다.
이 아키텍처는 소프트웨어 공학의 웹 아키텍처 분야에서 널리 채택되어 있으며, 마이크로서비스와 클라우드 컴퓨팅 환경에서 API를 설계하는 데 사실상의 표준으로 자리 잡았다. 관련 분야로는 HTTP와 HTTPS 프로토콜, 데이터 표현 형식인 JSON과 XML, 그리고 인증을 위한 OAuth 등이 있다.
2. 기본 원칙
2. 기본 원칙
2.1. 자원 (Resource)과 URI
2.1. 자원 (Resource)과 URI
REST 아키텍처의 핵심은 모든 것을 자원으로 추상화하고, 각 자원을 고유한 URI로 식별하는 것이다. 여기서 자원은 서버가 관리하는 모든 정보나 데이터를 의미하며, 예를 들어 사용자 정보, 주문 내역, 제품 카탈로그, 심지어 특정 계산 서비스까지도 자원이 될 수 있다. 각 자원은 네트워크 상에서 접근 가능한 고유한 주소, 즉 URI를 가지며, 클라이언트는 이 URI를 통해 특정 자원을 지목하고 해당 자원에 대한 작업을 요청한다.
URI 설계는 직관적이고 계층적 구조를 반영하는 것이 좋다. 일반적으로 자원의 컬렉션과 개별 항목을 구분하여 /users와 같이 컬렉션을 나타내고, /users/123과 같이 특정 자원의 식별자를 추가하여 개별 항목을 나타낸다. 이때 URI는 자원 자체를 식별하는 데만 사용되며, 자원에 대한 행위(조회, 생성, 수정, 삭제)는 HTTP 메서드를 통해 표현한다. 즉, URI는 '무엇(What)'을 대상으로 하는지 나타내고, HTTP 메서드는 '어떻게(How)' 처리할지 정의한다.
이러한 자원과 URI의 명확한 분리는 시스템을 단순화하고 이해하기 쉽게 만든다. 클라이언트는 일관된 방식으로 다양한 자원에 접근할 수 있으며, 서버는 URI 구조를 통해 자원의 관계와 계층을 자연스럽게 표현할 수 있다. 따라서 효과적인 RESTful API 설계의 첫걸음은 도메인의 핵심 개념을 자원으로 정의하고, 각 자원에 대해 의미 있고 일관된 URI 체계를 수립하는 것이다.
2.2. 표현 (Representation)
2.2. 표현 (Representation)
자원은 URI로 식별되지만, 클라이언트와 서버 간에 실제로 교환되는 데이터는 그 자원의 표현이다. 표현은 자원의 특정 시점의 상태나 데이터를 특정 형식으로 포장한 것으로, JSON이나 XML, HTML, 심지어 일반 텍스트나 이미지 파일도 표현이 될 수 있다. 동일한 자원이라도 클라이언트의 요청(HTTP 헤더)에 따라 서로 다른 표현(예: JSON 형식 또는 XML 형식)으로 전달될 수 있다.
표현은 자원 그 자체가 아니라, 자원을 전송하기 위한 구체적인 포맷이다. 예를 들어, '사용자 정보'라는 자원은 데이터베이스에 특정 구조로 저장되어 있지만, API를 통해 클라이언트에게 전달될 때는 사람이 읽기 쉬운 JSON 객체의 형태로 표현된다. 이때 콘텐츠 협상 메커니즘을 통해 클라이언트는 Accept 헤더를 사용해 선호하는 표현 형식을 서버에 요청할 수 있으며, 서버는 Content-Type 헤더를 통해 실제로 제공하는 표현의 형식을 알려준다.
표현의 개념은 REST의 유니폼 인터페이스 원칙을 구현하는 핵심 요소이다. 클라이언트는 자원의 URI와 표준화된 HTTP 메서드를 통해 표현을 요청하고, 서버는 요청을 처리한 후 해당 자원의 최신 상태를 담은 표현을 응답으로 돌려준다. 이를 통해 클라이언트는 서버의 내부 구현 방식을 알 필요 없이, 일관된 방식으로 자원의 상태를 얻거나 변경할 수 있게 된다.
2.3. HTTP 메서드
2.3. HTTP 메서드
HTTP 메서드는 RESTful 웹 서비스에서 클라이언트가 서버의 자원에 대해 수행하고자 하는 행동을 명시하는 동사 역할을 한다. 이는 URI로 식별되는 특정 자원에 대한 CRUD (생성, 읽기, 갱신, 삭제) 연산을 매핑하는 핵심 메커니즘이다. 주요 메서드로는 자원을 조회하는 GET, 새 자원을 생성하는 POST, 자원 전체를 교체하는 PUT, 자원의 일부를 수정하는 PATCH, 그리고 자원을 삭제하는 DELETE가 있다.
각 메서드는 멱등성과 안전성이라는 중요한 특성을 가진다. 멱등성은 동일한 요청을 여러 번 보내도 한 번 보낸 것과 같은 효과를 보장하는 성질로, GET, PUT, DELETE 메서드가 이에 해당한다. 안전성은 서버의 자원 상태를 변경하지 않는 성질로, GET 메서드가 대표적이다. 이러한 특성은 네트워크 장애 시 요청 재시도와 같은 상황에서 시스템의 예측 가능성과 신뢰성을 높이는 데 기여한다.
RESTful 설계에서는 이러한 표준 메서드의 의미를 준수하는 것이 중요하다. 예를 들어, 자원 생성은 POST를, 단순 조회는 GET을 사용해야 하며, GET 요청으로 서버 상태를 변경해서는 안 된다. 또한, HTTP 명세에 정의되지 않은 커스텀 메서드를 만드는 대신, 기존 메서드와 적절한 URI 설계를 조합하여 모든 기능을 표현해야 한다. 이는 API의 일관성과 이해를 돕고, 캐시나 프록시 서버와 같은 인터넷 인프라의 이점을 최대한 활용할 수 있게 한다.
2.4. 무상태성 (Statelessness)
2.4. 무상태성 (Statelessness)
RESTful 웹 서비스의 핵심 원칙 중 하나인 무상태성은 각 클라이언트 요청이 서버에 처리되는 데 필요한 모든 정보를 그 요청 자체에 포함해야 함을 의미한다. 즉, 서버는 클라이언트의 이전 요청이나 세션 상태를 저장하지 않고, 들어오는 각 요청을 독립적인 트랜잭션으로 처리한다. 이는 HTTP 프로토콜 자체의 무상태 특성을 따르는 것으로, 서버의 확장성과 신뢰성을 크게 향상시킨다.
무상태성의 가장 큰 장점은 시스템의 단순성과 확장성에 있다. 서버가 클라이언트 상태를 저장할 필요가 없으므로, 서버 자원을 요청 처리에만 집중할 수 있고, 로드 밸런싱이 매우 용이해진다. 어떤 서버 인스턴스로든 요청을 라우팅할 수 있어 트래픽 증가 시 서버를 쉽게 추가할 수 있으며, 특정 서버 장애 시에도 다른 서버가 요청을 이어받아 처리할 수 있다.
이 원칙을 준수하기 위해서는 인증 정보나 사용자 컨텍스트와 같은 필요한 상태 정보가 각 요청의 HTTP 헤더나 URI에 포함되어야 한다. 예를 들어, 세션 쿠키 대신 JWT와 같은 토큰을 Authorization 헤더에 담아 매 요청마다 전송하는 방식이 대표적이다. 이를 통해 서버는 별도의 세션 저장소를 관리하지 않고도 요청을 인증하고 처리할 수 있다.
그러나 무상태성은 모든 상태를 요청에 포함시켜야 하므로, 반복적으로 전송되는 데이터로 인해 네트워크 오버헤드가 증가할 수 있다는 단점도 있다. 또한, 서버 측에서 상태를 유지하는 것이 더 효율적인 특정 애플리케이션(예: 실시간 협업 편집)에는 적합하지 않을 수 있다. 이러한 트레이드오프를 고려하여 REST 아키텍처를 설계하는 것이 중요하다.
3. 디자인 가이드라인
3. 디자인 가이드라인
3.1. URI 설계 규칙
3.1. URI 설계 규칙
URI 설계 규칙은 RESTful API의 직관성과 일관성을 보장하기 위한 핵심 지침이다. 이 규칙들은 URI를 통해 자원을 명확하게 식별하고, 클라이언트와 서버 간의 상호작용을 예측 가능하게 만드는 데 목적이 있다.
가장 기본적인 규칙은 URI는 정보의 자원 자체를 나타내야 하며, 자원에 대한 행위는 HTTP 메서드를 통해 표현해야 한다는 점이다. 따라서 URI 경로에는 동사보다는 명사를 사용하는 것이 권장된다. 예를 들어, 사용자 목록을 조회하는 엔드포인트는 /getUsers보다 /users로 설계하는 것이 적절하다. 또한, 계층 관계를 표현할 때는 슬래시(/)를 사용하여 자원의 구조를 직관적으로 보여준다. 예를 들어, 특정 사용자가 작성한 게시글을 나타내는 URI는 /users/{userId}/posts와 같은 형태를 가질 수 있다.
URI는 소문자로 작성하고, 가독성을 위해 하이픈(-)을 사용하며, 밑줄(_)은 피하는 것이 일반적인 관례이다. 파일 확장자(예: .json, .xml)를 URI에 포함시키기보다는 HTTP 헤더의 Accept 필드를 통해 클라이언트가 원하는 표현 형식을 협상하도록 하는 것이 더 RESTful한 방식이다. 경로 파라미터는 단수형보다 복수형 명사를 사용하는 경우가 많으며, 쿼리 파라미터는 자원을 필터링하거나 정렬하는 등의 부가적인 작업에 활용된다.
이러한 규칙을 준수함으로써 API는 일관된 구조를 유지하게 되며, 개발자의 학습 곡선을 낮추고 API 문서화를 용이하게 한다. 결국, 잘 설계된 URI는 REST 아키텍처의 핵심 원리 중 하나인 균일한 인터페이스를 실현하는 데 기여한다.
3.2. HTTP 상태 코드 활용
3.2. HTTP 상태 코드 활용
RESTful 웹 서비스는 HTTP 프로토콜의 상태 코드를 적극적으로 활용하여 클라이언트의 요청 결과를 명확하게 전달한다. 이는 API 설계에서 매우 중요한 부분으로, 올바른 상태 코드를 반환함으로써 클라이언트가 서버의 응답을 정확히 해석하고 다음 동작을 결정할 수 있도록 돕는다.
주로 사용되는 상태 코드는 크게 성공, 클라이언트 오류, 서버 오류 카테고리로 나눌 수 있다. 성공 응답으로는 자원 생성 성공을 알리는 201 Created, 내용 없이 성공만을 나타내는 204 No Content 등이 대표적이다. 클라이언트 측 오류는 잘못된 요청을 의미하는 400 Bad Request, 인증 실패 시 사용하는 401 Unauthorized, 접근 권한이 없을 때의 403 Forbidden, 그리고 가장 유명한 자원을 찾을 수 없음을 알리는 404 Not Found가 핵심이다. 서버 측 오류는 내부 서버 문제를 나타내는 500 Internal Server Error가 일반적이다.
이러한 상태 코드의 체계적인 활용은 REST 아키텍처의 원칙 중 하나인 "균일한 인터페이스"를 구현하는 데 기여한다. 모든 상호작용이 표준화된 HTTP 메서드와 상태 코드를 통해 이루어지므로, 클라이언트와 서버 간의 결합도를 낮추고 상호 운용성을 높일 수 있다. 예를 들어, POST 요청에 대한 응답으로 201 Created와 함께 새로 생성된 자원의 URI를 Location 헤더에 제공하는 것은 널리 채택된 관례이다.
따라서 RESTful 서비스를 설계할 때는 각 API 엔드포인트가 발생시킬 수 있는 다양한 시나리오를 고려하여, 각 상황에 가장 적합한 표준 HTTP 상태 코드를 반환하도록 해야 한다. 이는 단순한 기술적 구현을 넘어, 명확하고 예측 가능한 웹 서비스 계약을 제공하는 데 필수적이다.
3.3. HATEOAS (Hypermedia As The Engine Of Application State)
3.3. HATEOAS (Hypermedia As The Engine Of Application State)
HATEOAS는 REST 아키텍처 스타일의 핵심 제약 조건 중 하나로, 로이 필딩이 그의 논문에서 제시한 개념이다. 이는 클라이언트가 서버와의 상호작용을 하이퍼미디어를 통해 동적으로 진행해야 한다는 원칙을 의미한다. 즉, 클라이언트는 애플리케이션의 초기 진입점(예: API의 루트 URI)만 알고 시작하며, 이후 모든 상태 전이는 서버가 제공하는 응답에 포함된 하이퍼링크를 따라가는 방식으로 이루어진다. 이는 웹 브라우저가 사용자가 링크를 클릭해 다음 페이지로 이동하는 방식과 유사하다.
이 접근 방식의 주요 목적은 클라이언트와 서버 간의 결합도를 낮추는 데 있다. 서버는 리소스의 상태와 함께, 현재 상태에서 가능한 다음 작업들(예: 주문 생성, 결제 진행, 상세 정보 조회)에 대한 링크를 JSON이나 XML 같은 표현 형식에 포함시켜 응답한다. 클라이언트는 이러한 링크를 해석하고 사용자에게 적절한 옵션을 제공하거나 자동으로 다음 단계를 수행할 수 있다. 따라서 서버가 URI 구조를 변경하거나 새로운 기능을 추가해도, 클라이언트는 하이퍼미디어 컨트롤을 통해 이를 자동으로 발견할 수 있어 유연성이 크게 향상된다.
실제 구현에서는 응답 본문에 _links 같은 객체를 포함시켜 관련 작업을 명시한다. 예를 들어, 주문 조회 응답에는 "주문 취소", "결제", "배송 상태 확인"에 대한 링크가 포함될 수 있다. 이는 API의 발견 가능성(Discoverability)을 높이고, 클라이언트 개발자가 API 문서에 지나치게 의존하지 않도록 돕는다. 그러나 HATEOAS를 완전히 구현하는 것은 복잡성과 표준화된 링크 관계 정의의 부재로 인해 현실에서 널리 채택되지는 못하고 있다. 많은 RESTful API는 기본적인 CRUD 작업에 집중하며, HATEOAS보다는 명시적인 URI 설계와 HTTP 메서드의 엄격한 사용에 더 중점을 두는 경향이 있다.
4. 장점과 단점
4. 장점과 단점
4.1. 장점
4.1. 장점
RESTful 웹 서비스는 로이 필딩이 제안한 아키텍처 스타일로, 웹의 기본 원리를 충실히 따르기 때문에 여러 가지 장점을 가진다. 가장 큰 장점은 단순성과 범용성이다. 기존의 복잡한 프로토콜을 사용하는 웹 서비스와 달리, HTTP라는 널리 알려진 표준 프로토콜과 그 메서드(GET, POST, PUT, DELETE 등)만을 사용하여 API를 설계한다. 이는 개발자들이 새로운 프로토콜을 학습할 필요 없이 익숙한 웹 기술을 활용할 수 있게 하여 학습 곡선을 낮추고 개발 효율성을 높인다.
또한, 무상태성 원칙 덕분에 확장성이 매우 뛰어나다. 서버가 클라이언트의 상태 정보를 저장할 필요가 없으므로, 각 요청은 독립적으로 처리된다. 이는 서버의 부하를 분산시키는 것이 용이하게 만들어, 사용자나 트래픽이 급증하는 상황에서도 추가 서버를 쉽게 배치하여 시스템을 수평적으로 확장할 수 있게 한다. 이는 클라우드 컴퓨팅 환경과 특히 잘 맞아떨어진다.
캐시 가능성도 중요한 장점이다. HTTP 프로토콜의 캐시 메커니즘을 그대로 활용할 수 있어, GET 요청 같은 안전한 조작에 대한 응답을 클라이언트나 중간 프록시 서버에 캐시할 수 있다. 이는 반복적인 데이터 요청에 대해 네트워크 왕복 시간을 줄이고, 서버의 부하를 감소시키며, 최종 사용자에게는 더 빠른 응답 속도를 제공한다.
마지막으로, 계층형 시스템 구조를 장점으로 들 수 있다. 로드 밸런서, 보안 게이트웨이, 캐시 서버 등 다양한 중간 계층을 시스템에 투명하게 추가할 수 있다. 이는 보안을 강화하거나, 성능을 최적화하거나, 시스템을 안정화하는 데 유연성을 제공한다. 또한, 클라이언트는 최종 서버와 직접 통신하는지, 중간 계층을 거치는지 알 필요 없이 일관된 인터페이스로 상호작용할 수 있다.
4.2. 단점
4.2. 단점
RESTful 웹 서비스는 널리 채택된 설계 스타일이지만, 몇 가지 명확한 단점을 가지고 있다. 가장 큰 문제점 중 하나는 표준화된 명세의 부재이다. REST는 엄격한 프로토콜이 아닌 아키텍처 스타일이기 때문에, 개발자마다 해석과 구현 방식에 차이가 발생할 수 있다. 이로 인해 일관성 없는 API 설계가 만들어지고, 클라이언트 개발자가 서로 다른 서비스의 엔드포인트와 상호작용 방식을 학습하는 데 어려움을 겪을 수 있다.
또 다른 단점은 HTTP 메서드와 상태 코드의 제한적 표현력이다. 복잡한 비즈니스 로직을 단순한 CRUD(Create, Read, Update, Delete) 작업으로 매핑하기 어려운 경우가 많다. 예를 들어, "승인"이나 "결제"와 같은 특정 도메인 작업을 POST, PUT, PATCH 중 어떤 메서드로 표현해야 할지 모호해질 수 있다. 이는 오버로딩된 POST 요청의 남용으로 이어져, REST의 원칙을 훼손하는 결과를 초래하기도 한다.
성능 측면에서도 비판을 받는다. 무상태성 원칙은 각 요청이 독립적이어야 함을 의미하며, 이는 서버의 확장성을 높이는 장점이 있다. 그러나 클라이언트의 상태를 매번 전송해야 하므로 요청의 오버헤드가 증가할 수 있다. 또한, HATEOAS를 완전히 구현할 경우, 클라이언트는 하이퍼미디어 컨트롤을 동적으로 파싱하고 처리해야 하므로 구현 복잡도가 증가하고, 캐싱 전략이 더 복잡해질 수 있다.
마지막으로, 실시간 통신에는 적합하지 않을 수 있다. REST는 기본적으로 요청-응답 모델을 따르므로, 서버가 클라이언트에게 비동기적으로 데이터를 푸시하는 실시간 웹 시나리오(예: 주식 시세, 채팅)에는 웹소켓이나 Server-Sent Events 같은 다른 프로토콜이 더 적합하다. 이러한 제약은 REST가 모든 종류의 웹 서비스에 대한 만능 해결책이 아님을 보여준다.
5. 구현 예시
5. 구현 예시
RESTful 웹 서비스의 구현은 HTTP 프로토콜과 그 메서드, URI 설계 규칙, 상태 코드를 명확히 따르는 데서 시작한다. 일반적으로 서버는 자원을 JSON이나 XML과 같은 구조화된 형식으로 표현하여 제공하며, 클라이언트는 해당 자원의 상태를 조작하기 위해 GET, POST, PUT, DELETE 등의 표준 HTTP 메서드를 사용한다. 예를 들어, 사용자 정보를 관리하는 서비스에서는 /users라는 URI를 사용자 컬렉션으로, /users/{id}를 특정 사용자로 정의한다.
구체적인 구현 예시로, 클라이언트가 사용자 목록을 조회하려면 GET /users 요청을 보낸다. 서버는 200 OK 상태 코드와 함께 사용자 목록을 JSON 배열 형태로 반환한다. 새로운 사용자를 생성할 때는 POST /users 요청에 생성할 사용자 데이터를 본문에 담아 보내며, 성공 시 서버는 201 Created 상태 코드와 함께 새로 생성된 자원의 위치(Location: /users/123)를 응답 헤더에 포함시킬 수 있다.
특정 사용자 정보를 수정하거나 삭제하는 작업은 각각 PUT /users/123과 DELETE /users/123 요청으로 수행된다. 이때 무상태성 원칙에 따라 각 요청은 필요한 모든 정보를 자체적으로 포함해야 하며, 서버는 세션 상태를 저장하지 않는다. 또한, HATEOAS 원칙을 구현하여 응답에 관련된 다른 자원으로의 링크(예: 사용자 상세 정보에서 해당 사용자가 작성한 게시글 목록으로의 링크)를 포함시키면, 클라이언트가 동적으로 애플리케이션 상태를 탐색할 수 있게 된다.
이러한 패턴은 웹 API 설계의 표준으로 자리 잡았으며, 마이크로서비스 아키텍처나 모바일 애플리케이션의 백엔드 서비스 구축에 널리 적용된다. 구현을 위한 프레임워크로는 스프링 부트, Express.js, Django REST framework 등 다양한 기술 스택이 활용된다.
6. 관련 기술 및 개념
6. 관련 기술 및 개념
6.1. HTTP/HTTPS
6.1. HTTP/HTTPS
HTTP는 RESTful 웹 서비스의 통신 프로토콜로서 핵심적인 역할을 한다. REST는 HTTP의 설계 철학을 그대로 반영하여, 자원을 URI로 식별하고, 해당 자원에 대한 조작을 HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 수행하도록 설계한다. 이는 웹의 기본적인 동작 방식과 일치하며, REST가 웹의 장점을 최대한 활용하는 아키텍처 스타일로 정의되는 이유이기도 하다. HTTP의 무상태성(Statelessness) 특성은 REST의 핵심 제약 조건 중 하나로 직접적으로 채택되어, 각 요청이 독립적으로 처리되도록 보장한다.
HTTPS는 HTTP에 보안 계층을 추가한 프로토콜이다. RESTful 서비스는 민감한 사용자 데이터나 중요한 API 키를 주고받는 경우가 많기 때문에, 실제 운영 환경에서는 HTTPS를 통한 통신이 필수적이다. HTTPS는 전송 계층 보안 프로토콜을 사용하여 데이터를 암호화함으로써, 통신 내용의 도청이나 변조를 방지하고 클라이언트와 서버 간의 신원을 확인하는 역할을 한다. 이는 인증 및 권한 부여 메커니즘과 함께 RESTful API 보안의 기초를 형성한다.
따라서 RESTful 서비스를 이해하고 구현하는 것은 HTTP/HTTPS 프로토콜에 대한 깊은 이해 없이는 불가능하다. 서비스의 성능, 확장성, 보안은 모두 이 기본 통신 프로토콜을 어떻게 효과적으로 활용하느냐에 달려 있다고 해도 과언이 아니다.
6.2. JSON/XML
6.2. JSON/XML
RESTful 웹 서비스에서 클라이언트와 서버 간의 데이터 교환 형식으로 JSON과 XML이 널리 사용된다. 이 두 형식은 모두 구조화된 데이터를 표현하는 데 적합하며, HTTP 프로토콜을 통해 자원의 표현을 전달하는 핵심 매체 역할을 한다. 특히 API 설계 시 서비스가 제공하는 데이터를 어떤 형식으로 직렬화하여 전송할지 결정하는 것은 중요한 요소이다.
JSON은 JavaScript Object Notation의 약자로, 경량의 데이터 교환 형식이다. 사람이 읽고 쓰기 쉽고, 기계가 파싱하고 생성하기도 쉬운 텍스트 기반 구조를 가진다. 키-값 쌍과 배열 자료 구조를 사용하며, 대부분의 현대 프로그래밍 언어에서 기본적으로 지원하거나 라이브러리를 통해 쉽게 처리할 수 있다. 이러한 간결함과 사용의 편의성 덕분에 최근의 웹 서비스와 모바일 애플리케이션 백엔드에서는 JSON이 사실상의 표준 형식으로 자리 잡았다.
반면 XML은 eXtensible Markup Language의 약자로, 문서의 구조와 의미를 태그를 사용하여 정의하는 마크업 언어이다. HTML과 유사한 트리 구조를 가지며, 스키마를 통해 문서 구조를 엄격하게 정의하고 검증할 수 있는 장점이 있다. 이는 데이터의 유효성 검사가 중요한 기업 간 전자 데이터 교환이나 복잡한 문서 중심의 시스템에서 여전히 유용하게 활용된다. 그러나 태그로 인해 상대적으로 장황하고, 파싱이 복잡하며, 파일 크기가 커질 수 있다는 단점도 있다.
두 형식의 선택은 서비스의 요구사항과 환경에 따라 달라진다. 빠른 처리와 간결한 데이터 전송이 중요한 마이크로서비스 아키텍처나 싱글 페이지 애플리케이션에서는 JSON이 선호된다. 반면, 복잡한 데이터 구조와 메타데이터, 공식적인 표준이 필요한 분야나 레거시 시스템에서는 XML이 여전히 사용된다. 많은 현대 REST API는 JSON을 기본 포맷으로 지원하면서도, 클라이언트의 요청 헤더에 따라 XML 표현을 함께 제공하는 경우도 있다.
6.3. OAuth
6.3. OAuth
OAuth는 인터넷 사용자가 웹사이트나 애플리케이션에 자신의 계정 정보를 직접 제공하지 않고도, 제3의 서비스가 해당 사용자의 자원에 접근할 수 있도록 권한을 위임하는 개방형 표준 인증 프로토콜이다. 예를 들어, 사용자가 소셜 미디어 계정으로 다른 웹 서비스에 로그인하거나, 클라우드 저장소 서비스가 사용자의 이메일 계정에 접근하여 연락처를 가져올 수 있도록 허용하는 데 널리 사용된다.
OAuth의 핵심은 자원 소유자(사용자)가 클라이언트(제3자 애플리케이션)에게 자신이 보유한 자원에 대한 제한된 접근 권한을 안전하게 부여하는 메커니즘을 제공하는 데 있다. 이를 통해 사용자는 ID와 비밀번호를 제3자에게 노출시키지 않으면서도 서비스 간의 기능 통합을 가능하게 한다. OAuth 2.0은 현재 가장 널리 채택된 버전으로, 웹 애플리케이션, 데스크톱 앱, 모바일 앱 등 다양한 클라이언트 유형을 지원한다.
OAuth 인증 흐름은 일반적으로 권한 부여 서버와 자원 서버가 참여한다. 사용자는 클라이언트의 접근 요청을 승인하면, 권한 부여 서버로부터 액세스 토큰을 발급받은 클라이언트는 이 토큰을 이용해 자원 서버에서 사용자의 데이터(예: 프로필, 사진)에 접근한다. 이 과정에서 중요한 것은 액세스 토큰이 특정 범위(Scope)와 유효 기간으로 제한된다는 점이다.
RESTful API를 설계할 때, 인증과 권한 부여는 보안상 필수적인 요소이다. OAuth는 이러한 API 보안 요구사항을 충족시키는 표준화된 방법을 제공하며, 많은 공개 API(예: 구글, 페이스북, 트위터의 API)가 사용자 데이터 접근을 위해 OAuth 2.0 프레임워크를 채택하고 있다. 따라서 RESTful 웹 서비스를 개발하거나 통합하는 경우 OAuth의 동작 원리와 구현 방식을 이해하는 것이 중요하다.
