네트워크에서 통신을 위한 일련의 규칙이자 약속( 통신규약 )들이 존재하며, 이를 프로토콜이라고 부른다.
그 중 인터넷 통신을 위한 프로토콜도 존재하는데 대표적인 것이 바로 IP다.
IP는 Internet Protocol의 약자로 인터넷 통신을 위한 일련의 통신 규칙들을 지칭한다.
IP기반 네트워크 환경에서 단말장치들이 서로를 인식하고 통신을 하기 위해 지정되는 주소체계를 IP 주소라고 부른다.
기본적으로 네트워크에 연결되는 단말장치에 탑재된 하나의 랜카드는 하나의 IP주소를 가진다.
유일한 값을 가지는 MAC 주소와는 달리 IP 주소는 보통 랜카드에 연결되는 네트워크에 따라 주소 값이 동적으로 변경된다.
IPv4와 IPv6 주소 체계
IPv4 주소의 길이는 총 32bit로 총 2^32 = 4,294,967,296 개의 IP 주소를 표현할 수 있다.
네트워크 규모가 커질수록 단말장치의 수는 점점 늘어나고, 이에 따라 IP 주소의 고갈을 염려해야한다.
그래서 등장한 것이 바로 IPv6다.
현재 사용하는 IP 주소는 32 bit 길이의 IPv4인 반면에 IPv6는 12 bit 길이로 IP 주소의 고갈 문제를 해결할 수 있다.
하지만 당장 IPv6로 적용하기는 대부분의 통신 장비들이 IPv4 주소 기반으로 제작되어 운용중이라 IPv6기반의 장비로 교체하거나 적용하기는 어렵다.
앞서 언급한 것처럼 IPv6로 주소체계를 바꾸기에는 어려우므로 IP 주소를 보다 효율적으로 사용할 필요가 있다.
그 방법 중 하나가 네트워크를 사설망과 공인망으로 구분하고, 할당되는 IP 주소를 달리해 사용하는 것이다.
사설망과 공인망
공인망( = 공중망, 외부망 )은 사용자가 세계 어디에 있더라도 접속할 수 있는 네트워크 즉, 인터넷이다.
공인망에서 쓰이는 IP 주소를 공인 IP라고 부르고, 인터넷상에서 유일한 IP 주소 값을 가진다.
사설망( = 내무방 )은 인터넷과 달리 특정 조직이나 기관 내에 독립적으로 사용하는 네트워크를 말한다. 인트라넷이 여기에 해당한다. 사설망에서 적용되는 IP 주소를 사설 IP라고 부른다. 사설 IP는 인터넷과 같은 외부망에서는 사용할 수 없고, 내부 네트워크에서만 사용할 수 있다. 외부 접속 목적이 아니라 사설망 내부 통신에서만 활용되기 때문에 다른 사설망에서 중복해서 사용해도 된다.
사설망과 공인망 사이의 통신 ( NAT )
사설망이라고 해서 인터넷을 이용할 수 없는 것은 아니다. 사설망과 공인망 사이에 망을 중계하는 역할을 하는 네트워크 장비를 하나 두고, 이 네트워크 장비에서 사설망의 IP 주소를 공인 IP 주소로 변경해 데이터를 중계하면 사설망에서도 인터넷을 이용할 수 있다.
네트워크 장비는 사설 IP와 공인 IP를 모두 가지고 있으며, 자신을 지나는 데이터의 사설 IP 주소를 자신의 공인 IP 주소로 바꾸어 중계한다. 이러한 기능을 네트워크 주소 변환( NAT, Network Address Translation )이라고 한다.
하나의 Request가 있으면 그에 대응하는 Response가 있다. 다시 말해,Request가 없으면 Response를 보내지 않는다.
연결을 유지하지 않기 때문에 리소스를 줄일 수 있어서 많은 트래픽을 빠르게 처리가 가능하다.
2. Stateless ( 무상태 )
연결을 한번 하고 끊기 때문에, 이전에 일어났던 일( 상태 )를 저장하고 있지 않는다.
매번 새로운 요청을 처리한다. ( 세션, 쿠키, DB로 해당 요청에 대한 정보를 임의로 저장해 처리하긴 한다. )
3. HTTP 프로토콜의 메세지 구조
HTTP 프로토콜의 메세지 구조는 위 그림과 같다.
이 중에서 중요하게 살펴볼 부분은 헤더( header ) 부분인데, 메세지에 필요한 모든 부가 정보가 들어있고, 그림처럼 넣고 싶은 내용을 임의로 추가 할 수도 있다.
General Header
Date : 현재 시간
Pragma : 캐시제어( no-cache ), HTTP/1.0에서 쓰던 것으로 HTTP/1.1에서는 Cache-Control이 쓰인다.
Cache-Control : 캐시 제어 + no-cache( 모든 캐시를 쓰기 전에 서버에 해당 캐시를 사용해도 되는지 확인 ) + public( 공유 캐시에 저장해도 됨 ) + max-age( 캐시의 유효시간을 명시 ) + private( '브라우저' 같은 특정 사용자 환경에만 저장 ) + must-revalidate( 만료된 캐시만 서버에 확인 ) + no-store( 캐시를 저장하지 않음 )
Transfer-Encoding : body 내용 자체 압축 방식 지정. 본문에 데이터 길이가 나와서 야금야금 브라우저가 해석해 화면에 뿌려줄 때 이 기능을 사용한다. ( 'chunked'면 본문의 내용이 동적으로 생성되어 길이를 모르기 때문에 나눠서 보낸다는 의미 )
Upgrade : 프로토콜 변경시 사용
Via : 중계( 프록시 )서버의 이름, 버전, 호스트명
Content-Encoding : 본문의 리소스 압축 방식( transfer-encoding은 body 자체이므로 다르다 )
Content-type : 본문의 미디어 타입(MIME) 예) application/json, text/html
Content-Length : 본문의 길이
Content-Language : 본문을 이해하는데 가장 적절한 언어. 예) ko
Expires : 자원의 만료 일자
Allow : 사용이 가능한 HTTP 메소드 방식 예) GET, HEAD, POST ...
Last-Modified : 최근에 수정된 날짜
ETag : 캐시 업데이트 정보를 위한 임의의 식별 숫자
Connection : 클라이언트와 서버의 연결 방식 설정 HTTP/1.1은 kepp-alive로 연결을 유지하는게 디폴트
● Request Line : 어떤 웹서버로 접속( Host 부분 )해서, 어떠한 방식( HTTP / 1.1 )으로, 어떠한 메소드( GET )를 통해 무엇을( /doc/test/.html ) 요청했는지에 대한 메시지가 담겨있다. ( GET /test.html http 1.1 )
● Host : 요청하려는 서버 호스트 이름과 포트번호
● User-agent : 클라이언트 프로그램 정보 예) Mozilla / 4.0, Windows NT5.1 ( 이 정보를 통해 서버는 클라이언트 프로그램( 브라우저 )에 맞는 최적의 데이터를 보내줄 수 있다. )
● Referer : 바로 직전에 머물렀던 웹 링크 주소( 해당 요청을 할 수 있게된 페이지 )
● Accept : 클라이언트가 처리 가능한 미디어 타입 종류 나열 예) */* - 모든 타입 처리가능, application/json - json데이터 처리 가능
● Accept-charset : 클라이언트가 지원가능한 문자열 인코딩 방식
● Accept-language : 클라이언트가 지원가능한 언어 나열
● Accept-encoding : 클라이언트가 해석가능한 압축 방식 지정 예) gzip, deflate