3 분 소요

서론

RESTful API에 대해서 알아봅시다.

본론

  1. API(Application Programming Interface)란?
    • API는 애플리케이션끼리 연결해주는 매개체이자 약속이라고 볼 수 있습니다.
    • 그럼 현실에서는 어떤것을 API로 비유할 수 있을까?
      • 키보드로 글자를 입력하면 키보드는 우리가 작성한 글자를 컴퓨터에 전달해주는 역할을 합니다. 우리가 키보드의 키를 누르는것이 API를 호출하는것으로 볼 수 있습니다.
      • 어떤 연인은 서로 기분이 상할것 같으면 미리 “윙크”를 하기로 약속했습니다. 대화하다 갑자기 “윙크”를 본 상대방은 기분이 나쁜것을 알아채고 은근히 기분을 풀어주려 노력합니다. 이러한 약속 또한 API라고 볼 수 있습니다.
    • 우리가 API를 작성한다는 의미는?
      • 웹 어플리케이션(프론트엔드)에서 원하는 기능을 수행하는 URL인터페이스제공한다는 의미입니다.
      • 우리가 작성 할 API에서 원하는 데이터를 받아 데이터베이스에 데이터를 저장하고, 저장되어 있는 데이터를 읽어서 웹 어플리케이션(프론트엔드)에 데이터를 제공하는 행위를 통해 사용자가 원하는 목적을 이룰 수 있게 해야 합니다.
  2. 그럼 REST API는 어떤 의미를 갖는 API인가?
    • REST API, RESTful API 라고 들어보셨나요? 여기서 REST란 무슨 의미일까요?
    • REST는 “Representational State Transfer”의 줄임 말로, 위키를 따르면 다음과 같습니다.

      REST(Representational State Transfer)는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다.

    • 최대한 간단하게 설명하자면 URL, Headers, Method 등 네트워크 표현 수단을 사람이 봐도 이해하기 쉬운 표현으로 정의한다고 이해하면 됩니다. 또한 이 “REST 아키텍쳐”는 사람이 봐도 쉽게 이해할 수 있도록 “자원”을 정의하고 이 “자원”을 중심으로 표현을 구성하는 원칙을 제시합니다.
  • REST API의 구성은 크게 세 가지로 이루어 집니다
    1. 자원(Resource) - URL
      • 우리가 만들 소프트웨어가 관리하는 모든 것을 자원으로 표현할 수 있습니다. 쇼핑몰이라면 상품(Goods)에 대해서 정보를 관리할것이고 또는 장바구니(Carts)에 담긴 상품들도 관리해야겠죠.
    2. 행위 - HTTP method
      • 이전에 배웠던 HTTP method 기억나시나요? GET, POST 등등이 있다고 했었는데요. 이것으로 해당 자원에 대한 행위를 표현할 수 있습니다. 예를 들어 GET 메소드는 해당 자원의 조회, POST 메소드는 해당 자원의 생성 이런 식으로요.
      • 이렇게 나누어진 것을 보통 CRUD 라고 합니다. 자원에 대한 생성/조회/수정/삭제를 각각의 method 로 나누어놓은 것이지요.
      • Create : 생성(POST)
        Read : 조회(GET)
        Update : 수정(PUT),(PATCH)
        Delete : 삭제(DELETE)
        
      • 위 이미지의 예시처럼 쓰이는 것이 일반적인 method 사용방식입니다. 하지만 이것은 필수인 부분이 아니고 모든 곳에서 다 이렇게 지켜서 사용하지는 않습니다. 상황에 따라 저것을 완벽하게 지키기 어려운 부분들도 있으니 이 부분 참고 해주세요.
    3. 표현
      • 해당 자원을 어떻게 표현할지에 대한 설명입니다. 보통 JSON, XML 같은 형식을 이용해서 자원을 표현합니다.
      • HTTP에서는 Content-Type 이라는 헤더를 통해 표현 방법을 서술합니다
      •   router.get('/books', (req, res) => {
            res.json({ success: true, data: getAllBooks() });
          });
        
      • 위의 예시 코드는 /books 라는 URL을 통해 전체 책 목록을 불러와 응답해 주는 역할을 하는 API입니다.
        • 위의 API는 REST API의 관점에서 보았을때 URL로 리소스를 구분할 수 있고 다른 표현이 없으므로 전체 리스트를 불러오는것을 짐작 할 수 있습니다. 또한 CRUD 중 Read를 담당하는 HTTP 메소드로 표현하여 REST한 API라고 볼 수 있습니다.

최근에 stateless한 개발이 트렌드인 이유?

첫째, 클라우드 컴퓨팅의 발전으로 인한 분산 시스템의 확대입니다. 클라우드 컴퓨팅 기술이 발전하면서, 많은 애플리케이션이 분산 시스템으로 구성됩니다. 분산 시스템에서는 여러 대의 서버에서 동작하는데, 이때 각 서버는 서로 다른 상태를 가질 수 있습니다. 이러한 상태 정보를 서버에 저장하면 서버 간의 데이터 불일치 문제가 발생할 수 있습니다. 따라서, 상태 정보를 클라이언트 측에서 유지하는 stateless한 구조가 필요해졌습니다.
둘째, 마이크로서비스 아키텍처의 등장입니다. 마이크로서비스 아키텍처는 애플리케이션을 작은 단위로 분리하여 각 단위를 독립적으로 개발, 배포, 관리하는 방식입니다. 이때 각 서비스는 독립적으로 동작하므로, 각 서비스의 상태를 따로 유지하기 어렵습니다. 따라서, 서비스 간의 상태 정보를 공유하지 않는 stateless한 구조가 필요합니다.

위와 같은 이유로 stateless한 개발이 트렌드가 되었습니다. 이를 통해 애플리케이션의 확장성, 유연성, 안정성 등을 높일 수 있습니다.

RESTful API 에서 인증과 인가를 어떻게 처리하나요?

RESTful API에서 인증(Authentication)과 인가(Authorization)는 각각 다음과 같이 처리됩니다.

인증(Authentication)

  • 클라이언트는 인증 토큰을 헤더에 담아서 API 요청을 보냅니다.
  • 서버는 인증 토큰을 검증하고, 해당 클라이언트가 인증되었다면 요청을 처리합니다.
  • 인증 토큰은 대부분 JWT(Json Web Token) 방식을 사용합니다.

인가(Authorization)

  • 인증된 클라이언트가 API 요청을 보낼 때마다, 요청된 리소스에 대한 권한을 검증합니다.
  • 권한 검증 방식은 API마다 다르며, 일반적으로 RBAC(Role-Based Access Control) 방식을 사용합니다.
  • 클라이언트가 해당 리소스에 접근할 수 있는 권한이 있다면, 서버는 요청을 처리하고, 그렇지 않다면 에러를 반환합니다.

RESTful API에서 인증과 인가를 처리할 때는 보안과 안정성을 고려해야 하므로, 안전한 인증 토큰 생성 및 검증 방식과 적절한 권한 검증 방식을 선택하는 것이 중요합니다.

결론

REST API 또는 RESTFUL API는 URL, Headers, Method 등 네트워크 표현 수단을 사람이 봐도 이해하기 쉬운 표현으로 정의한다고 할 수 있고, 이 때 REST 아키텍쳐는 크게 3가지로 구성이 되어 있다.
자원, 행위, 표현 이렇게 3가지를 통해서 간결하고 직관적인 설계 및 HTTP 프로토콜을 이용하여 범용성과 호환성이 뛰어나고, 캐싱 지원 및 다양한 포맷을 지원합니다.

참고자료 및 블로그

  • 내일배움캠프 튜터님 강의 자료