티스토리 뷰

[업데이트 2017.02.21 16:07]

 

REST API에 대해 기술적으로 학습 및 정리를 하기 위해 다양한 자료를 수집하다보니 정작 구현에만 집중하고 있는 자신을 발견하게 되었습니다. OSI 7 계층 중에서 응용 계층에 속하는 HTTP 프로토콜에 대한 배경 지식을 먼저 아는 것이 REST API를 제대로 학습하는 길이라 생각 되었습니다.

 

그래서 해당 포스팅을 통해 간략히 OSI 7 계층 및 HTTP 프로토콜에 대해 정리하고자 합니다.

먼저 HTTP 프로토콜이 OSI 7 계층 중에 어떤 것에 속하는지부터 정리를 해보려고 합니다.

 

1. OSI 7 계층

OSI 7 계층은 이름에서 알 수 있듯이 7개의 계층으로 구성됩니다. 자세한 내용은 아래 WiKi 정보를 참고하시기 바랍니다.

7개 계층에서 우리가 자주 들어본 프로토콜에 대해서 명시를 해보았습니다. HTTP, FTP ,TELNET 등의 프로토콜이 응용 계층에 속하며, 일반적으로 응용 소프트웨어들이 사용하는 계층입니다. 이제 이것들 중에서 응용 계층의 HTTP 프로토콜에 대해 정리를 해보고자 합니다.

 

 

2. HTTP 프로토콜

HTTP 개발은 Tim Berners-Lee에 의해 1989년 만들어졌습니다. HTTP 프로토콜은 응용 계층 프로토콜로 World Wide Web (WWW)를 위한 데이터 통신의 기초이며, TCP/IP 프로토콜 위에서 동작합니다. HTTP 약자는 Hypertext Transfer Protocol (HTTP)를 의미하며, 이미지, 동영상, 오디오, 텍스트를 포함한 Hypertext 즉, Hyperlink와 같은 링크 기반의 데이터를 주고 받기 위한 프로토콜입니다. 대표적으로 주고 받는 데이터 형태가 HTML문서입니다. 주요 특징에 대해 정리해보았습니다.

 

2.1 Client-Server Computing Model

HTTP 프로토콜은 request-response 프로토콜로 client-server 아키텍쳐입니다.

 

2.2 URI

HTTP 리소스는 Uniform Resource Locators (URLs)를 통해 네트워크상에서 위치가 정의되며, 해당 URL을 표현하기 위해 Uniform Resource Identifiers (URI's)를 사용하여 표현합니다.

 

<A generic URI of the HTTP URL form>

scheme:[//[user:password@]host[:port]][/]path[?query][#fragment]

 

2.3 Stateless

HTTP는 Client에서 request를 보낸 후, Server에서 response가 오면 현재 연결을 끊는 connection less 방식으로 동작합니다. 따라서 수백만명이 접속하는 웹서비스 형태로 접속이 최소한으로 유지되어도 문제가 없는 응용 소프트웨어에 적합한 구조입니다. 그러나 Client의 이전 상태에 대해 알 수 없기 때문에, HTTP 프로토콜로 웹서비스를 구현 할 때, Cookie 또는 web form안의 hidden variables를 통해 이러한 문제를 해결하고 있습니다. 이러한 HTTP의 특징을 Stateless라고 합니다.(세션 관리) HTTP/0.9, 1.0에서는 request/response가 완료되면 연결이 바로 끊겼는데, HTTP/1.1부터는 keep-alive-mechanism을 지원하며, connection을 특정 시간 동안 유지시켜줍니다.


아래는 cURL을 통해 keep-alive를 지원하는지 테스트한 결과입니다. request header에 "Connection: Keep-Alive"를 설정하여 테스트시 keep-alive가 지원되는 경우 response header에 "Connection: Keep-Alive" 및 "Keep-Alive: timeout=5, max=100"가 포함됩니다.


여기서 timeout은 하나의 connection당 최대 5초까지 유지된다는 의미이고, max는 최대로 유지할 수 있는 connection 개수입니다. 예를 들어 최초 연결 1회 일 때, max는 100이고 그 이후 connection부터 -1씩 감소하게 됩니다. 예를 들어 2회 GET request시 max는 99가 됩니다.

 

<cURL을 통해 Apache 웹서버 keep-alive 지원 확인>

C:\>curl -v http://192.168.0.1 -H "Connection: keep-alive"

* Rebuilt URL to: http://192.168.0.1/
*   Trying 192.168.0.1...
* TCP_NODELAY set
* Connected to 192.168.0.1 (192.168.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.168.0.1
> User-Agent: curl/7.52.1
> Accept: */*
> Connection: Keep-Alive
>
< HTTP/1.1 200 OK
< Date: Fri, 03 Feb 2017 10:11:39 GMT
< Server: Apache/2.4.17 (Win32) PHP/7.0.1
< X-Powered-By: PHP/7.0.1
< Content-Length: 42
< Content-Type: text/html; charset=UTF-8
< Keep-Alive: timeout=5, max=100
< Connection: Keep-Alive
<

2.4 Request / Response Message Format

<Request Message>

Request Message는 다음과 같이 구성되며, 각 라인은 <CR><LF>를 포함해야 합니다. 공백라인의 경우도 <CR><LF>로 구성되어야 하며, whitespace가 포함되면 안됩니다.

 

- A request line: [Request Method] [Request URI] HTTP/[HTTP version]으로 구성됩니다.

  ex) GET /images/logo.png HTTP/1.1

 

- Request header files: Connection: Keep-Alive와 같은 header field들로 구성됩니다.

  ex) Connection: Keep-Alive

 

- An empty line: 공백 라인도 포함할 수 있으며, <CR><LF>로 구성되어야 하며, whitespace는 포함 할 수 없습니다.

- An optional message body: Request시 추가로 포함시켜서 보낼 데이터를 지정할 수 있습니다.

 

<Response Message>

Response Message는 다음과 같이 구성됩니다.

 

- A status line: HTTP/[HTTP version] [status code] [reason message]로 구성 됩니다.

  ex) HTTP/1.1 200 OK

 

- Response header files: Cache-Control과 같은 header field들로 구성됩니다.

  ex) Cache-Control: max-age=2592000
       Expires: Wed, 08 Mar 2017 06:53:07 GMT

 

- An empty line: 공백 라인도 포함할 수 있으며, <CR><LF>로 구성되어야 하며, whitespace는 포함 할 수 없습니다.

- An optional message body: Response시 추가로 포함시켜서 보낼 데이터를 지정할 수 있습니다.

 

<Request Method>

주요 Request Method는 GET/PUT/POST/DELETE 등이 있으며, 보통 Database과 비교하여 아래와 같은 용도로 사용됩니다.(CRUD operation)

 

- POST   <-> Create

- GET     <-> Read

- PUT     <-> Update

- DELETE <-> Delete

 

다음은 각 HTTP method별 특성에 대해 정리된 테이블입니다. 각 method에 따라 cachable, idempotent 등의 각기 다른 특성을 가집니다. Cachable의 경우 웹서버에서 caching 기능을 지원하는 경우 해당 method로 request시 caching 기능을 사용할 수 있습니다. idempotent YES의 의미는 GET/PUT/DELETE와 같이 특정 레코드를 업데이트 또는 삭제, 읽기 와 같이 여러번 수행해도 그 결과가 변함 없는 경우를 의미합니다. POST의 경우는 여러번 수행시 레코드 POST횟수 만큼 추가 되기 때문에 idempotent가 NO인 경우에 속합니다.

 

* 발췌: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

 

<Status Code>

HTTP request후 response message에 request에 대한 결과로 상태 코드를 반환합니다. 주요 상태코드로는 2xx Success, 4xx Client Error, 5xx Server Error로 나뉩니다. 해당 에러에 대해서는 필요할 때마다 찾아보면 될 것 같습니다. 상태코드에 대한 자세한 정의는 아래의 주소를 참고하시기 바랍니다.

 

* 참고: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

 

2.5 Cacheable

HTTP Cachable 기능의 경우 HTTP request/response에 대한 round-trip 부하를 줄이기 위해 사용됩니다. Client에서 Server상에서 지정한 만기일에 따라 새문서를 가져오거나 또는 cache로 부터 가져오도록 설정할 수 있습니다.  Apache의 설정 파일에서 expires_module load 설정을 해야 합니다.

 

ExpiresActive On를 통해 해당 기능을 enable 할 수 있으며, enable이 되어야 cacheable에 대한 header 정보가 response message에 포함됩니다. ExpiresDefault를 통해 기본 cache 만기일을 지정할 수 있습니다. 또한 ExpiresByType을 통해 문서 MIME 타입에 따라 다르게 만기일 지정이 가능합니다. 아래와 같이 access(접속 시간 기준) 또는 modification(파일 수정 시간 기준) 만료일을 설정 할 수 있습니다.

ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"

아래의 설정의 경우 기본값은 접속 기준 2달간 cache 데이터를 사용하며, text/html 타입에 대해서는 1분, image/gif 타입에 대해서는 1달의 만료일을 가지는 것을 의미합니다. 해당 시간이 지나면 다시 새 문서 또는 이미지를 웹서버로부터 가져오게 됩니다. 자세한 내용은 아래의 Apache module 정보를 참고하시기 바랍니다.

ExpiresDefault "<base> [plus] {<num> <type>}*"
ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"
LoadModule expires_module modules/mod_expires.so

<IFMODULE expires_module modules>
ExpiresActive On
ExpiresDefault "access plus 2 month"
</IFMODULE>

<Directory "C:/Apache/public_html">
Options FollowSymLinks
AllowOverride All
Require all granted

ExpiresByType text/html "access plus 1 minutes"
ExpiresByType image/gif "access plus 1 month"

</DIRECTORY>

또는 다음과 같이 특정 확장자(gif|jpg|png|js|css) 또는 디렉토리(C:/Apache/public_html/resources)로 지정할 수도 있습니다.

<Directory "C:/Apache/public_html/resources">
Options FollowSymLinks
AllowOverride All
Require all granted

<FilesMatch "\.(html|gif|jpg|png|js|css)$">
ExpiresDefault "access plus 1 day"
</FilesMatch>
</DIRECTORY>

 

* 참고: https://httpd.apache.org/docs/2.4/ko/mod/mod_expires.html

 

아래의 그림은 Firefox를 통해 Apache 서버에 cacheable을 테스트한 결과입니다. 최대 2분으로 만료일 설정후 테스트한 결과로 2분내로 request시 캐시된 데이터가 로드 됨을 확인 할 수 있습니다.

 

 

2.6 Authentication

HTTP 프로토콜은 자체적으로 Basic / Digest Authentication을 지원합니다. Basic Authentication의 경우 Client에서 사용자명/암호를 base64 인코딩을 하여 HTTP header에 설정하여 주고 받습니다. 그러나 보안에 취약한 부분이 있어 잘 쓰이진 않습니다. Digest Authentication의 경우 사용자명/암호를 포함하여 그 외의 정보를 MD5 값으로 인증을 진행합니다.


 

3. HTTPS

HTTPS의 경우 또 다른 응용 계층의 HTTP 프로토콜이 아니라 표현 계층의 프로토콜로 암호화/복호화를 위한 프로토콜입니다. 따라서 HTTP over TLS, HTTP over SSL, HTTP Secure와 같이 불리웁니다. 웹서버에 디지털 인증서 설치 및 설정이 필요한 부분입니다.

 

 

이번 포스팅에서는 HTTP프로토콜에 대해서 중요하다고 생각되는 항목에 대해서만 스터디차원에서 정리를 해보았습니다. 보다 더 자세한 내용은 아래의 링크를 참고하시기 바랍니다.

 

* 참고: https://en.wikipedia.org/wiki/OSI_model

* 참고: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

* 참고: https://en.wikipedia.org/wiki/Uniform_Resource_Locator

* 참고: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

* 참고: https://www.joinc.co.kr/w/Site/Network_Programing/AdvancedComm/HTTP

* 참고: http://icecreamie.tistory.com/entry/HTTP-11-%EC%BA%90%EC%8B%9C-%EA%B4%80%EB%A0%A8-%ED%97%A4%EB%8D%94

* 참고: https://httpd.apache.org/docs/2.4/ko/mod/mod_expires.html

* 참고: http://www.websiteoptimization.com/speed/tweak/cache/

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함