python과 java를 배우며 언어는 달라도 필자가 원하는 목적(웹 제작, 서버 구축 등)을 문제 없이 수행할 수 있겠다 생각했다.
그러던 중 파이썬으로 서버는 어떻게 구축할 수 있는지 궁금해 검색한 결과를 정리한다.
파이썬 서버 개발 > 파이썬 API 서버 구축 > django API 서버 구축 > RESTful API > RESTful API란?
1.RESTful API란
두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스이다.
- REST를 기반으로 만들어진 API를 의미.
(REST 아키텍처 스타일을 따르는 API)
1-1. REST
- API 작동 방식에 대한 조건을 부과하는 소프트웨어 아키텍처이다.
REST
는 Representational State Transfer의 약자로 자원을 이름으로 구분해 해당 자원의 상태를 주고받는 모든것.
- 리소스 상태에 대한 표현을 요청자에게 전송한다.
(HTTP:JSON, HTML, XLT 등)
a) REST 아키텍처 스타일 원칙
- 균일한 인터페이스
- 무상태
- 클라이언트는 임의의 순서로 리소스를 요청할 수 있으며, 모든 요청은 무상태 혹은 다른 요청과 분리
- 계층화 시스템
- 클라이언트 요청 이행위해 함께 작동하는 보안, 비즈니스 로직 등은 여러 계층으로 여러 서버에서 실행될 수 있도록 웹 서비스 설계 가능
- 캐시 가능성
- 서버 응답 시간 개선을 위해 클라이언트 혹은 중개자의 일부 응답 저장하는 프로세인 캐싱 지원
- 온디맨드 코드
- 서버는 프로그래밍 코드를 클라이언트에 전송해 클라이언트 기능일 일시적으로 확장하거나 조정할 수 있다.
1-2. API
- 다른 소프트웨어 시스템과 통신하기 위해 따라야 하는 규칙.
- 때때로 API는 정보 제공자와 사용자 간의 계약으로 지칭되며 소비자에게 필요한 콘텐츠(호출)와 생산자에게 필요한 콘텐츠(응답)로 구성된다.()
"웹 API는 클라이언트와 웹 리소스 사이의 게이트웨이라 생각할 수 있다."
1) 클라이언트
* 정보에 엑세스하려는 사용자로, 사람이거나 소프트웨어 일 수 있다.
2) 리소스
* 애플리케이션이 클라이언트에 제공하는 정보
* 클라이언트에 리소스를 제공하는 시스템을 서버라 한다.
2.장점
1. 확장성
아래 요소를 통해 성능 저하하는 통신 병목 현상을 일으키지 않으며, 확장성을 지원한다.
- 무상태는 서버가 과거 클라이언트 정보를 유지할 필요가 없어 서버 로드 제거
- 잘 관리된 캐싱으로 일부 클라이언트 - 서버 상호 작용을 부분적 혹은 완전히 제거
- REST가 클라이언트-서버 상호 작용을 최적화하므로 효율적 크기 조정 가능
2. 유연성
- 완전한 클라이언트-서버 분리 지원
- 각 부분이 독립적으로 발전할 수 있도록 다양한 서버 구성 요소 단순화 및 분리
- 서버 앱의 플랫폼/기술 변경은 클라이언트 앱에 영향을 주지 않는다.
- 앱 함수를 계층화하는 기능은 유연성을 더욱 확장시킨다
3. 독립성
- 통신에 영향을 주지 않고 양쪽의 기본 기술 변경 가능
- API 설계에 영향 없이 다양한 프로그래밍 언어로 클라이언트 및 서버 앱 모두 작성 가능
3.작동방식
(클라이언트) 리소스 필요할 때 API를 사용해 서버 접속
(API 개발자) API 문서에 REST API 사용 방법 설명
3-1. 일반적인 REST API호출 단계
- (
클라이언트
) 서버에 요청 전송
- API 문서에 따라 서버가 이해하는 방식으로 요청
- (서버) 클라이언트 인증 및 클라이언트 권한 확인
- (서버) 요청 수신 및 처리
- (
서버
) 클라이언트에 응답 반환
- 응답 - 성공 여부 포함
- 응답 - 클라이언트 요청 정보
3-2. 클라이언트 요청
-
고유 리소스 식별자
- URL(Uniform Resource Locator)을 사용해 리소스 식별 수행
- 리소스에 대한 경로 지정
- 요청 엔드포인트라 하며, 클라이언트가 요구하는. 사항을 서버에 명확하게 지정
-
메서드
- HTTP 메서드, 리소스에 수행해야 하는 작업을 서버에 알려준다.
메서드 | 설명 |
---|
GET | * 해당 메서드로 서버의 지정된 URL의 리소스에 액세스(가져온다.) * 요청에 파라미터를 넣어 전송 전 데이터 필터링하도록 서버에 지시 가능 |
POST | * 서버에 데이터 전송 (같은 POST 중복 요청시 리소스 중복 생성하는 부작용 ) |
PUT | * 리소스 업데이트 * 동일 PUT 여러 번 전송해도 중복 생성 없음 |
DELETE | * 리소스 제거 * 서버 상태 변경 가능 * 사용자에게 인증 없으면 요청 실패 |
- HTTP 헤더
- 요청 헤더는 클라이언트와 서버 간 교환되는 메타데이터
- 데이터
- REST API 요청에는 POST, PUT 및 기타 HTTP 메서드가 작동하기 위한 데이터 포함될 수 있다.
- 파라미터
- URL 세부 정보 지정하는
경로 파라미터
- 리소스에 대한 추가 정보 요청하는
쿼리 파라미터
- 클라이언트 빠르게 인증하는
쿠키 파라미터
3-3. 서버 응답
REST 원칙에 따라 서버 응답에 아래와 같은 주요 구성 요소 포함해야 한다.
1. 상태 표시줄
- 메시지 본문
- 응답 본문에는 리소스 표현이 포함된다.
- 서버는 헤더에 포함된 내용 기반으로 적절한 표현 형식 선택
- 클라이언트는 데이터 작성 방식을 XML or JSON 형식으로 요청 가능
예)
{"name":"John", "age":30}
- 헤더
- 응답에 대한 헤더 또는 메타데이터도 포함
- 서버, 인코딩, 날짜 등의 정보와 응답에 대한 추가 컨텍스트 제공
4.RESTful API 인증 방법
RESTful 서비스 클라이언트는 응답을 보내기 전 신뢰를 구축하기 위해 서버에 자신의 신원을 증명하는 인증이 필요하다.
RESTful API에는 4가지 일반적 인증 방법이 있다.
-
HTTP 인증
HTTP는 REST API 구현시 직접 사용할수 있는 일부 인증 체계를 정의한다.
- 기본 인증
- 클라이언트는 요청 헤더에 사용자 이름과 암호를 넣어 전송
- 안전한 전송을 위해 이 페어를 64자의 세트로 변환하는 인코딩 기술인 base64로 인코딩한다.
- 전달자 인증
- 토큰 전달자에 대한 액세스 제어를 제공하는 프로세스이다.
- 클라이언트는 리소스에 액세스하기 위해 요청 헤더에 토큰을 넣어 전송한다.
-
API 키
REST API 인증을 위한 또 다른 옵션
- 서버는 고유하게 생성된 값을 최초 클라이언트에 할당
- 클라이언트는 리소스에 액세스할 때마다 고유 API 키를 사용해 본인 검증 실시
- 클라이언트가 이 키를 전송해야하므로 네트워크 도난에 취약
-
OAuth
- 모든 시스템에 대해 매우 안전한 로그인 액세스 보장위해 암호와 토큰 결합
- 서버는 먼저 암호를 요청해 권한 부여 프로세스 완료하기 위해 추가 토큰 요청
- 특정 범위와 수명으로 언제든 토큰 확인 가능
참고
https://aws.amazon.com/ko/what-is/restful-api
https://www.redhat.com/ko/topics/api/what-is-a-rest-api
https://khj93.tistory.com/entry/네트워크-REST-API란-REST-RESTful이란
https://appmaster.io/ko/blog/rest-apiran-mueosimyeo-dareun-yuhyeonggwa-eoddeohge-dareungayo