Steel Train

← 뒤로가기

이론(1) - 웹 기본상식

1. 기초 개념

1-1. 인코딩

컴퓨터의 모든 데이터는 0과 1로 구성된다. 이것을 'Encoding' 표준이라고 부르는데, 대표적으로 'Ascii'와 'Unicode'가 있다.

#Ascii - 7비트 데이터에 대한 인코등 표준이다. 이를 이용해서 알파벳과 특수 문자 등을 표현할 수 있다. 예를 들어, '1000001'의 데이터를 아스키로 변환하면 "A"가 된다.

초창기에는 각 언어별로 영어는 'Ascii', 한글은 'CP-949' OR 'EUC-KR' 등을 사용했다. 하지만 호환성이나 개발측면에서 부담이 되어 '유니코드'라는 새로운 표준을 만들었다.

#Unicode - 한 문자는 최대 32개의 비트로 표현되며 표현할 수 있는 정보 가짓수는 2의 32승이다. 대략 42억 개이다.

네트워크를 이용하면 인코딩한 정보를 다른 사람들과 쉽게 교환할 수 있는데, 결국 유니코드로 인코딩된 데이터가 웹 서버를 통해 우리에게 전달되고 있는 것이다.

 

1-2. 통신 프로토콜

클라이언트는 웹에게 특정 리소스를 지정해서 제공해달라고 요청하면 서버가 해당 요청을 이해하고, 대응되는 동작을 통해 클라이언트에게 반환한다. 이때 클라이언트의 행위를 요청(Request), 서버의 행위를 응답(Response)라고 한다.

프로토콜(Protocol)은 이런 상호작용이 규격화되어 있다. 사람의 경우 서로 융통성있게 생각하며 상호작용을 이해하면 된다. 전화의 경우, '여보세요' 라고 시작했을때, '끊어' 또는 '바이' 라고 하며 마무리를 짓기 때문이다. 하지만 컴퓨터는 이러한 융통성있는 상호작용이 어렵다. 그래서 매우 '엄격한 프로토콜'이 필요하다.

'엄격한 프로토콜'을 유지하기 위해 '문법(syntax)'을 포함 시킨다. 일반적으로 문법에 어긋나는 메시지는 잘못 전송된 것으로 취급하여 무시된다. 예를 들어, 'GET'으로 요청해야하지만 'GIVEME'라고 요청하면 웹서버에서는 오류로 처리해버린다.

현재까지 제정된 표준 통신 프로토콜은 다음과 같다.

- 네트워크 통신 기초인 'TCP/IP'

- 웹 애플리케이션이 사용하는 'HTTP'

- 파일을 주고받을 때 사용하는 'FTP' 등

 

1-3. HTTP

HTTP는 서버와 클라이언트 데이터 교환을 요청과 응답 형식으로 정의한 프로토콜이다. 

기본 메커니즘은 클라이언트가 서버에 요청하면 서버가 응답한다. 웹 서버는 HTTP 서버를 HTTP 서비스 포트에 대기시킨다. 이 포트는 일반적으로 TCP/80 또는 TCP/8080이다. 클라이언트가 서비스 포트에 HTTP 요청을 전송하면 이것을 해석하여 응답으로 반환한다.

#네트워크 포트(Network Port) - 서버와 클라이언트가 정보를 교환하는 추상화된 장소를 의미한다. 항구라고도 불린다. 클라이언트가 서버의 포트에 접근해서 데이터를 내려놓고, 서버가 클라이언트에 보낼 데이터를 실어서 돌려보내는 장면을 연상하면 된다.

#서비스 포트(Service Port) - 특정 서비스가 점유하고 있는 포트(항구)라고 생각하면 된다. HTTP가 80번 포트를 점유하고 있다면 HTTP의 서비스 포트는 80번 포트가 된다.

포트간 데이터를 교환하는 방식은 '전송 계층(Transport Layer)의 프로토콜을 따른다. 대표적으로 TCP와 UDP가 있다. TCP로 데이터를 전송하려는 서비스에 UDP 클라이언트가 접근하면, 데이터가 교환되지 않는다. 반대도 마찬가지. 그래서 서비스 포트를 표기할 때는 서비스가 사용하는 전송 계층 프로토콜을 같이 표기하기도 한다. (ex : HTTP의 서비스포트가 TCP/80이라고 하면, HTTP 서비스를 80번 포트에서 TCP로 제공하고 있다는 의미)

포트의 갯수는 OS에 정의하기 나름이다. Window+Linux+Mac은 0~65535번 총 65536개의 네트웍 포트를 사용한다.

0~1023번 포트는 '잘 알려진 포트(Well-known port)' 또는 '특권 포트(Privileged port)'라고 한다. 유명한 서비스가 등록되어 있기 때문이다. 대표적으로 22번은 SSH, 80에는 HTTP, 443에는 HTTPS가 할당되어 있다. 잘 알려진 포트에 서비스를 실행할려면 관리자 권한이 필요하기에 관리자의 것이라고 신뢰할 수 있다.

 

1-4. HTTP 메시지

HTTP 메시지는 HTTP 요청(클라이언트가 전송하는), HTTP 응답(서버가 반환하는)이 두가지가 있다. 기능과 세부구조는 다르지만, 크게 보면 이들은 HTTP 헤더와 바디로 구성된다는 공통점이 있다.

#HTTP 헤더 - 각 줄은 CRLF로 구분되며, 첫 줄은 '시작 줄', 나머지 줄은 '헤더'라고 부른다. 영문 표기는 Headers와 Header로 말하지만 한국에서는 모두 '헤더'로 부른다. 헤더의 끝은 빈 줄로 나타낸다. '시작 줄'의 역할은 요청과 응답에서 큰 차이가 있다. '헤더'는 '필드'와 '값'으로 구성되며 HTTP 메시지 또는 바디의 속성을 나타낸다. 하나의 HTTP 메시지에는 0개 이상의 헤더가 있을 수 있다.

#HTTP 바디 - 헤드의 끝을 나타내는 CRLF 뒤 모든 줄을 말한다. 전송하려는 데이터가 바디에 담긴다.

*CRLF란? - Carriage Return Line Feed 를 말하며, 커서를 현재 줄의 맨 앞으로 이동시키는 문자인 CR과 커서를 다음 줄로 이동시키는 문자인 LF를 말한다. 주로 텍스트 파일에서 줄 바꿈을 나타내는 데 사용되는 제어 문자열이다. Windows는 줄을 종결하기위해 CR도 사용하여, CRLF를 사용하지만 Linux나 Unix 기반 OS의 경우 LF만 사용한다.

 

1-5. HTTP 요청

'HTTP 요청'은 서버에게 특정 동작을 요구하는 메시지이다. 서버는 해당 동작이 실현 가능한지, 클라이언트가 그러한 동작을 요청할 권한이 있는지 등을 검토하고 적절하다면 이를 처리한다.

1-5-1. 시작줄

'메소드(Method)', '요청 대상(Request target)' 그리고 'HTTP 버전'으로 구성된다. 그리고 각각 '띄어쓰기'로 구분 한다.

'메소드'는 요청 대상에 대해 서버가 수행하길 바라는 동작을 나타낸다. HTTP 표준에 정의된 메소드는 8개가 있지만 보통 'GET' OR 'POST'를 사용한다.

#GET - 리소스를 요청하는 메소드이다. 웹서버 주소를 입력하거나 하이퍼링크 클릭 시, 새로운 페이지 렌더링을 위한 리소스를 서버에 요청하여 받는다.

#POST - 데이터를 보내는 메소드이다. 전송할 데이터는 'HTTP 바디'에 포함되며, 로그인 시 작성하는 ID, Password 또는 게시글 등이 서버에 보내진다.

이 외에 '요청 URL'는 메소드의 대상을, 'HTTP 버전'은 클라이언트가 사용하는 HTTP 프로토콜의 버전을 나타낸다.

 

1-6. HTTP 응답

HTTP 요청에 대한 결과를 반환하는 메시지이다. 요청 수행 여부 및 미수행 시 이유 를 담은 '상태 정보(Status)' 그리고 클라이언트에게 전송할 리소스를 포함하고 있다.

1-6-1. 시작줄

HTTP 버전, 상태코드(Status Code), 처리사유(Reason Phrase)로 구성된다. 각각읜 띄어쓰기로 구분된다.

#HTTP 버전 - 서버에서 사용하는 HTTP 프로토콜의 버전을 나타낸다. '

#상태코드(Status Code) - 요청에 대한 처리 결과를 3자릿수로 나타낸다. HTTP 표준인 'RFC 2616'은 대략 40여개의 '상태 코드'를 정의하고 있는데, 첫번째 자릿수에 따라 5개의 클래스로 분류된다.

#처리사유(Reason Pharse) - 상태 코드가 발생한 이유를 짧게 기술한 것이다.

상태 코드 설명 대표 예시
1xx 요청을 제대로 받았고, 처리가 진행중  
2xx 요청이 제대로 처리됨. 200(OK):성공
3xx 요청을 처리하려면 클라이언트가 추가 동작을 취해야 함. 302(Found):다른 URL로 갈 것
4xx 클라이언트가 잘못된 요청을 보내어 처리에 실패함.

400(Bad Request):요청이 문법에 맞지 않음

401(Unauthorized):클라이언트가 요청한 리소스에 대한 인증이 실패함

403(Forbidden):클라이언트가 리소스에 요청할 권한이 없음.

404(Not Found):리소스가 없음

5xx 클라이언트의 요청은 유효하지만, 서버에 에러가 발생하여 처리에 실패함.

500(Internal Server Error):서버가 요청을 처리하다가 에러가 발생함

503(Service Unavailable):서버가 과부하로 인해 요청을 처리할 수 없음.

 

1-7. HTTPS

'HTTPS(HTTP over Secure socket layer)'은 HTTP의 응답과 요청이 평문으로 전달되며, 'TLS(Transport Layer Security)'프로토콜을 도입하여 탈취하거나 중간에 가로채서 계정 탈취 문제점을 보완한다. 'TLS'는 모든 HTTP 메시지를 암호화하며, 도청이나 변조로부터 보호된다. 그리고 기본 포트는 443이다.