텍스트 기반의 통신규약, 인터넷에서 데이터를 주고 받을 수 있는 프로토콜
이렇게 정해진 규약에 맞춰 개발을하기 때문에 서로 정보를 교환할 수 있게 됨
클라이언트(=사용자)가 브라우저 등을 통해서 요청(request)하면 서버에서 해당 요청사항에 맞는 결과를 클라이언트에게 응답(response)하는 형태로 동작
통신을 할 때 HTML 문서도 많이 주고 받지만, JSON이나 XML 형태의 정보도 주고 받을 수 있음
요청: client->server
응답: server->client
형태: HTML, JSON, XML, Plain text 등
서버가 클라이언트의 상태를 보존하지 않음, 이전에 어떤 요청을 했는지 관계없이 각 요청을 독립적인 트랜잭션으로 취급함
상태 프로토콜과 무상태 프로토콜이 어떻게 다른지 예시를 통해 알아보자.
Stateful
손님A
: 새우깡 얼만가요?
직원A
: 1000원입니다.
손님A
: 3개 주세요.
직원A
: 3천원 입니다.(3개 달라고 하는 것이 새우깡인걸 알고 있음, 새우깡
상태유지)
손님A
: 카드로 할게요
직원A
: 결제 완료되었습니다.(새우깡 3개를 결제하는 상황을 알고 있음, 새우깡
과 3개
상태유지)
Stateless(제대로 안된 예시)
손님A
: 새우깡 얼만가요?
직원A
: 1000원입니다.
손님A
: 3개 주세요.
직원B
: 어떤걸 3개 드릴까요?(3개 달라고 하는 것이 어떤 것인지 모름)
손님A
: 카드로 할게요.
직원C
: 결제 완료되었습니다.(어떤것을 결제하려고 하는지 모름)
예시와 같이 무상태 프로토콜은 이전의 요청과 관계없이 해당 요청을 독립적으로 처리하기 때문에 무상태에서 제대로 동작하기 위해서는 손님이 추가 정보를 보내야한다.
손님A
: 새우깡 얼만가요?직원A
: 1000원입니다.손님A
: 새우깡 3개 주세요.(새우깡
이라는 정보를 추가로 제공)직원B
: 3천원 입니다.손님A
: 새우깡 3개 카드로 할게요.(새우깡
과 3개
라는 정보를 추가로 제공)직원C
: 결제 완료되었습니다.Stateful은 중간에 직원A
에서 다른 직원으로 변경이 되면 제대로 된 처리를 할 수 없지만, Stateless는 다른 직원으로 변경 되더라도 문제 없이 처리가 가능하다. 이게 Stateless의 장점인 서버의 확장성이 높다는 것이다.
만약 Stateful인데 client1
이 server1
에 요청을 보내서 처리를 했다면, 중간에 server1
가 장애가 생기면 client1
의 요청은 처리할 수 없다. 또는 서버를 추가해도 client1
은 server1
에서만 가능하기때문에 새로운 client
가 아닌 이상 추가된 서버에는 요청을 보내지 않을 것이다.
이와 반대로 Stateless는 중간에 server
가 바뀌어도, 추가되어도 client1
과 다른client
의 요청을 잘 처리할 수 있다.
이렇게 모든 것을 Stateless로 설계하면 좋지만 그럴수 없는 경우도 있는데 예시로는 로그인
이 있다. 이러한 로그인
상태를 유지하는 것은 쿠키와 세션을 통해 상태를 유지한다.
하지만 이런 상태유지는 최소한만으로 사용하는 것이 좋다.
client가 접속 순간부터 연결을 계속 해서 하고있다면, 가만히 있어도 서버의 자원이 계속 소모되고 있어서 비효율적이다. client가 늘어날 수록 더더욱 비효율적으로 서버를 사용하게 된다.
그래서 요청을 보내면서 연결되고, 응답을 보내면서 연결을 종료한다. 이렇게 하면 가만히 있는 순간에는 서버의 자원을 효율적으로 사용 할 수 있다.
요청과 응답의 속도는 매우 빠르기 때문에, 속도는 많이 느려지지 않고 서버의 자원은 매우 효율적이게 된다.
TCP/IP는 연결을 새로 할 때마다 3way handshake을 하는 시간이 추가로 필요한데, 웹사이트 한페이지만 요청을해도 필요한 파일이 html뿐 아니라 javascript, css, 이미지 등이 있기 때문에3way handshake시간이 많이 소모가 된다.
HTTP에서는 이 부분을 HTTP 지속 연결로 문제를 해결했다.
연결을 끊는 시간을 조금 늘려서 한 페이지에 대한 resource를 다 받고 나면 그 이후에 연결을 끊도록 되어있다.
클라이언트가 서버에게 연락하는 것, 요청을 할 때에는 요청에 대한 정보를 HTTP 메시지에 담아서 서버로 보냄
이름 | 설명 |
---|---|
GET | 자료를 요청할 때 사용, 데이터를 쿼리스트링을 통해 전송 |
HEAD | 자료를 요청할 때 사용, 단 서버에서 HTML 본문을 return하지 않음(상태확인용도) |
POST | 자료의 생성, 변경을 요청할 때 사용, 데이터를 HTTP 메시지 body에 담아서 전송(주로 데이터 생성목적) |
PUT | 자료의 수정을 요청할 때 사용, 자료가 없다면 새로운 자료를 생성해 달라고 요청하는 용도(주로 데이터 수정 목적, 전체 데이터) |
DELETE | 자료의 삭제를 요청할 때 사용, 특정 자료를 삭제함 |
PATCH | 자료의 수정를 요청할 때 사용, (주로 일부 데이터를 수정 목적) |
PUT: 리소스를 완전히 대체함
PATCH: 리소스의 일부분 수정함
GET https://velog.io/@0_sujeong HTTP/1.1 // 시작줄
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... // 헤더
Upgrade-Insecure-Requests: 1
서버가 요청에 대한 답변을 클라이언트에게 보내는 것
상태 코드는 세 자리로 이루어져 있으며, 아래와 같이 분류 할 수 있다.
코드 | 설명 |
---|---|
1XX | 조건부 응답, 응답을 받았으며 작업을 계속함 |
2XX | 성공, 클라이언트가 요청한 동작을 수신하여 이해하고 승낙한 뒤 성공적으로 처리함 |
3XX | 리다이렉션 완료, 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 함 |
4XX | 요청 오류, 클라이언트에게 오류가 있음 |
5XX | 서버 오류, 서버가 요청을 수행하지 못했음 |
/members
-> /users
, /members
는 다시 사용하면 안됨WWW-Authenticate
헤더와 함께 인증 방법을 설명HTTP/1.1 200 OK // 시작줄
Connection: keep-alive // 헤더
Content-Encoding: gzip
Content-Length: 35653
Content-Type: text/html;
<!DOCTYPE html><html lang="ko" data-reactroot=""><head><title...
HTTP 전송에 필요한 모든 부가정보가 있으며, 표준 헤더가 너무 많다. 또 필요하면 임의의 헤더를 추가해서 사용할 수 있다.
헤더의 종류
메시지 본문을 통해 표현 데이터(=요청이나 응답에서 전달할 데이터)전달
request 메시지와 response 메시지 둘 다 사용
request 메시지에서만 사용하는 헤더
클라이언트가 선호하는 표현 요청에 대한 헤더 정보
우선순위
구체적인 것을 우선
ex)
Accept: text/*,text/plain,*/*
1위: text/*
2위: text/plain
3위: */*
우선순위
우선순위 값이 있어 높은 값을 사용, 0~1사이, 클수록 높은 우선순위, 생략하면 1
ex)
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
1위: ko-KR(q생략) ->ko-KR
2위: ko;q=0.9 ->ko
3위: en-US;q=0.8 ->en-US
4위: en;q=0.7 ->en
출처
1. [HTTP Method] GET POST PUT HEAD PATCH DELETE 차이
2. HTTP란 무엇인가?
3. 모든 개발자를 위한 HTTP 웹 기본 지식
4. 무상태 프로토콜