TCP는 데이터의 흐름을 제어할 수는 있지만 데이터가 전송되어야 할 경로에 대한 규약은 아니기 때문에 경로에 대한 규약인 IP를 함께 사용한다. 이 둘은 반드시 함께 사용되므로 TCP/IP라고 표기한다.
클라이언트는 매 HTTP 요청마다 본인이 누구인지를 인지시킬 수 있는 정보를 어딘가에 포함시켜야 하며, 서버 또한 클라이언트의 자원 접근을 허용하기 전에 이러한 인증 정보를 기반으로 인증 과정을 일차적으로 거쳐야 한다.
사용자 A가 작성한 게시글을, 다른 사용자가 마음대로 수정/삭제할 수 없게 만들어야 하기 때문이다
기본 인증 방식으로 클라이언트에 대한 사용자 이름과 암호를 base64로 인코딩 문자열을 보낸다.
- 사용자명, 패스워드 등을 조합하여 md5 값으로 인증한다. 기본 인증보다 보안이 강화된 인증 방식이다.
- 동작원리는 클라이언트에서 페이지를 요청하면 서버는 digest 인증이 필요하다고 통보하고 클라이언트는 사용자 아이디, 패스워드를 입력하면 서버+클라이언트 정보 병합 후 md5(128비트 암호화 해시 함수)로 암호화 시켜 전송한다.
- HTTPS의 클라이언트 인증서를 이용한 인증 방식으로서 단독으로 사용되지 않고 폼 베이스 인증과 합쳐져서 이용되고 있다.
- 인증이 필요한 리소스의 리퀘스트가 있을 경우 서버는 클라이언트에게 클라이언트 증명서를 요청하고 사용자는 클라이언트 증명서를 선택 후 서버 송신하고 서버는 클라이언트의 증명서를 검증하여 검증 결과가 정확하다면 클라이언트의 공개키를 취득 후 보안 세션이 이루어진다.
- 클라이언트와 서버에 있는 유저 ID나 패스워드 등의 자격 정보를 포함한 리퀘스트를 송신한다.
- 보통은 POST 메소드가 사용되어 엔티티 바디에 자격 정보를 저장한다.
- 서버 측은 유저를 식별하기 위해서 세션 ID를 발행한다. 클라이언트에서 수신한 자격 정보를 검증하는 것으로 인증을 하고, 유저의 인증 상태를 세션 ID와 연관 지어 서버 측에 기록한다.
- 클라이언트 측에 송신할 때는 SET-COOKIE 헤더 필드에 세션 ID를 저장해서 리스폰스를 반환한다.
- 서버 측에서 세션 ID를 받은 클라이언트는 쿠키로 저장한다. 다음번에 서버에 리퀘스트를 송신하는 때에는 브라우저가 자동으로 쿠키를 송출하기 때문에 세션 ID가 서버로 송신되면서 인증이 된다.
HTTP 통신은 기본적으로 '요청(Request)'과 '응답(Response)'으로 이루어져 있다.
클라이언트가 서버에 요청을 보내면, 그에 맞는 응답 결과를 돌려주고, 클라이언트는 사용자에게 서버로부터 응답받은 결과를 보여주는 것이다.
우리가 http://naver.com으로 요청을 보내면, 우리는 클라이언트인 웹 브라우저를 통해서 네이버 서버에 네이버 시작 페이지를 보여달라는 요청을 하는것이고, 네이버 서버는 요청을 받으면 네이버 시작페이지에 해당하는 html 페이지를 클라이언트에 응답한다.
HTTP 통신은 기본적으로 연결이 되어 있지 않다. 연결이 되어 있지 않다는 것은 클라이언트가 서버에 요청을 보내고, 서버로부터 필요한 파일을 모두 받고 나면 접속이 종료(Connection Close)된다.
1. Start Line
POST /payment-sync HTTP/1.1
2. Header
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
{
"imp_uid": "imp_1234567890",
"merchant_uid": "order_id_8237352",
"status": "paid"
}
HTTP 요청 그 자체에 대한 정보를 담고 있다
1) 자주 사용되는 Header 정보
Host
- 요청이 전송되는 target의 호스트의 URL 주소를 알려 주는 헤더.
User-Agent
- 요청을 보내는 클라이언트에 대한 정보 (ex. 웹 브라우저에 대한 정보)
Accept
- 해당 요청이 받을 수 있는 respons body 데이터 타입을 알려 주는 헤더.
Connection
- 해당 요청이 끝난 후에 클라이언트와 서버가 계속해서 네트워크 연결을 유지할 것인지 아닌지에 대해 알려주는 헤더.
Content-Type
- HTTP 요청이 보내는 메시지 body의 타입을 알려주는 헤더.
Content-Length
- HTTP 요청이 보내는 메시지 body의 총 사이즈를 알려주는 헤더.
HTTP 프로토콜은 연결 상태를 유지하지 않는(Connection less) 프로토콜이다. 이유는 웹의 기본 개념은 불특정 사용자에게 서비스를 하는 것이기 때문이다. 그렇기에 특정 사용자와 계속 연결을 하고 있을 이유가 없기 때문에 다른 새로운 특정 사용자와 연결을 하기 위해 Connection을 데이터 전송 후 바로 끊도록 설계되어 있다.
초창기에 출시된 HTTP 1.0으로 인해 전송의 성공과 실패 여부를 알 수 있는 상태 코드가 생겨났고, 헤더 개념이 요청과 응답 모두에 도입됐으며, 이 헤더(Content-Type)의 도움으로 HTML뿐만 아니라 다른 문서들도 전송 가능하게 되었다.
HTTP 1.0은 계속 연결을 해줬다, 끊어줬다 하는 방식의 동작 방식을 취하였다. 이러한 동작 방식이 초창기에는 효율적일지 모르나 시대가 변하며 이러한 기능이 효율적이지 못하게 되었다.
이런 비효율 점을 개선하기 위해 나온 것이 HTTP 1.1이다.
HTTP 1.1부터 Keep-Alive라는 기능을 지원하게 되는데 연결이 마지막으로 종료된 시점부터 정의된 시간까지 새로운 연결이 없더라도 대기하는 구조를 말한다. 즉 정의된 시간 내에 연결이 이루어진다면 계속 연결된 상태를 유지할 수 있는 기능이다.
하지만 HTTP 1.1은 문제가 있었는데
이러한 문제를 해결하기 위해 출시된 HTTP 2.0이 출시되었다.
하지만 HTTP 2.0도 HOLB(Head of line Blocking) 문제에서 자유로울 수 없었다. 프로토콜이 TCP를 사용하는 한 피해 갈 수 없는 문제인 것이다.여러개의 HTTP 스트림을 하나의 TCP 커넥션으로 처리하기 때문에 더 크게 영향을 받게 된다.
UDP
QUIC(Quick UDP Internet Connections)
- HTTP 2.0 과 3.0의 차이