10. REST API + RESTful
REST(Representational State Transfer)
: 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미
- 즉 HTTP URI를 통해 자원을 명시하고, HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미
CRUD Operation
: Create, Read, Update, Delete를 묶어서 일컫는 말
- Create : 데이터 생성(POST)
- Read : 데이터 조회(GET)
- Update : 데이터 수정(PUT, PATCH)
- Delete : 데이터 삭제(DELETE)
- 구성 요소)
- 자원(Resource) : HTTP URI
- 자원에 대한 행위(Verb) : HTTP Method
- 자원에 대한 행위의 내용(Representations) : HTTP Message Pay Load
- 장점)
- HTTP 프로토콜의 표준을 최대한 활용하여 여러 추가적인 장점을 함께 가져갈 수 있게 해줌
- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능함
- REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도한느 바를 쉽게 파악할 수 있음
- 여러 가지 서비스 디자인에서 생길 수 있는 문제를 최소화
- 서버와 클라이언트의 역할을 명확하게 분리함
- 단점)
- HTTP Method 형태가 제한적임
- 브라우저를 통해 테스트할 일이 많은 서비스라면 쉽게 고칠 수 있는 URL보다 Header 정보의 값을 처리해야 하므로 전문성이 요구됨
- 구형 브라우저에서 호환이 되지 않아 지원해주지 못하는 동작이 많음 -> 익스플로어
- 특성)
- Server - Client(서버 - 클라이언트 구조)
- Stateless (무상태)
- Cacheable(캐시 처리 가능)
- Layerd System(계층화)
- Uniform Interface(인터페이스 일관성)
API(Application Programming Interface)
: 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙
REST API
: REST의 아키텍쳐 스타일을 따르는 API를 의미
1. URI는 명사, 소문자를 사용해야 함
Bad Example http://lsh98.com/Studying/
Good Example http://lsh98.com/study/
2. 마지막에 슬래시(/)를 포함하지 않음
Bad Example http://lsh98.com/study/
Good Example http://lsh98.com/study
3. 언더바 대신 하이픈을 사용
Bad Example http://lsh98.com/study_blog
Good Example http://lsh98.com/study-blog
4. 파일 확장자는 URI에 포함하지 않음
Bad Example http://lsh98.com/photo.png
Good Example http://lsh98.com/photo
5. 행위를 포함하지 않음
Bad Example http://lsh98.com/delete-post/1
Good Example http://lsh98.com/post/1
RESTful
: REST 아키텍처를 구현하는 웹 서비스를 RESTful 웹 서비스라고 함
- RESTful API라는 용어는 일반적으로 RESTful 웹 API를 의미하지만, RESTful API와 REST API라는 용어는 같은 의미로 사용 가능함
- 모든 CRUD 기능을 POST로 처리하는 것은 API 혹은 URI 규칙을 지키지 않음
-> REST API를 사용하였지만 RESTful하지 못한 시스템임
- 작동원리)
- 클라이언트가 서버에 요청을 전송
- 서버가 클라이언트를 인증하고 해당 요청을 수행할 수 있는 권한이 클라이언트에 있는지 확인
- 서버가 요청을 수신하고 내부적으로 처리
- 서버가 클라이언트에 응답을 반환 -> 응답에는 요청이 성공했는지 여부를 클라이언트에 알려주는 정보가 포함 + 클라이언트가 요청한 모든 정보도 포함
1. RESTful API 클라이언트 요청 구성 요소
1) 고유 리소스 식별자
- 서버는 고유한 리소스 식별자로 각 리소스를 식별
- REST 서비스의 경우 서버는 일반적으로 URL을 사용하여 리소스 식별을 수행
- URL은 리소스에 대한 경로를 지정
- URL은 요청 엔트포인트라고도 하며 클라이언트가 요구하는 사항을 서버에 명확하게 지정
2) 메소드
- GET)
- 클라이언트는 GET을 사용하여 URL의 리소스에 접근
- GET 요청을 캐싱하고 RESTful API 요청에 파라미터를 넣어 전송하여 전송 전에 데이터를 필터링하도록 서버에 지시 가능
- POST)
- 클라이언트는 POST를 사용하여 서버에 데이터를 전송
- 여기에는 요텅과 데이터 표현이 포함됨
- 동일한 POST를 여러 번 전송할 경우 동일 리소스를 여러 번 생성하는 부작용이 있음
- PUT)
- 클라이언트는 PUT을 사용하여 서버의 기존 리소스를 업데이트
- POST와 달리, RESTful 웹 서비스에서 동일한 PUT 요청을 여러 번 전송해도 결과는 동일
- DELETE)
- 클라이언트는 DELETE 요청을 사용하여 리소스를 제거
- DELETE 요청은 서버 상태를 변경할 수 있음
- 사용자에게 적절한 인증이 없으면 요청은 실패
3) HTTP Header
: Header는 클라이언트와 서버 간 교환되는 메타데이터
- EX) 요청 헤더는 요청 및 응답의 형식을 나타내고 요청 상태 등에 대한 정보를 제공
- Data)
- REST API 요청에는 POST, PUT 등 기타 HTTP Method가 성공적으로 작동하기 위한 데이터가 포함될 수 있음
- Parameter)
- RESTful API 요청에는 수행해야 할 작업에 대한 자세한 정보를 서버에 제공하는 파라미터가 포함될 수 있음
2. 파라미터 유형
- URL 세부 정보를 지정한는 경로 파라미터
- 리소스에 대한 추가 정보를 요청한느 쿼리 파라미터
- 클라이언트를 빠르게 인증하는 쿠키 파라미터
3. RESTful API 인증 방법
- RESTful 웹 서비스는 응답 전 요청을 인증해야 함
- 클라이언트는 신분증이나 운전 면허증을 제시하여 자신의 신원을 증명하듯 신뢰를 구축하기 위해 서버에 자신의 신원을 먼저 증명해야 함
1) HTTP 인증
: HTTP는 REST API를 구현할 때 직접 사용가능한 일부 인증 체계를 의미
- 기본 인증)
- 기본 인증에서 클라이언트는 요청 헤더에 사용자 이름과 암호를 넣어 전송
- 안전한 전송을 위하여 이 페어를 64자의 세트로 변환하는 인코딩 기술인 base64로 인코딩함
- 전달자 인증)
- 전달자(bearer)인증은 토큰 전달자에 대한 엑세스 제어를 제공한느 프로세스
- 일반적으로 전달자 토큰은 서버가 로그인 요청에 대한 응답으로 생성하는 암호화된 문자열
- 클라리언트는 리소스에 엑세스하기 위해 요청 헤더에 토큰을 넣어 전송
2) API key
- 이 접근 방식에서 서버는 고유하게 생성된 값을 최초 클라이언트에 할당함
- 클라이언트는 리소스에 접근하려고 할 때마다 고유 API 키를 사용하며 본인을 검증
- API 키 경우 클라이언트가 이 키를 전송해야 되므로 네트워크 도난에 취약하다는 단점이 있음
3) OAuth
- OAuth는 모든 시스템에 대해 매우 안전한 로그인 접근을 보장하기 위해 암호와 토큰을 결합함
- 서버는 먼저 암호를 요청한 다음 권한 부여 프로세스를 완료하기 위해 추가 토큰을 요청
- 특정 범위와 수명으로 언제든지 토큰 확인 가능
4. RESTful API 서버 응답 구성 요소
1) 상태 표시줄
- 요청 성공 또는 실패를 알리는 3자리 상태 코드가 존재
- 코드 예시)
- 200 : 일반 성공 응답
- 201 : POST 메소드 성공 응답
- 400 : 서버가 처리할 수 없는 잘못된 요청
- 404 : 리소스를 찾을 수 없음음
2) 메시지 본문
- 응답 본문에는 리소스 표현이 포함됨
- 클라이언트는 데이터 작성 방식을 XML 또는 JSON 방식으로 정보를 요청할 수 있음
3) 헤더
- 응답에 대한 추가 컨텍스트를 제공하고 서버, 인코딩, 날짜 및 콘텐츠 유형과 같은 정보를 포함