티스토리 뷰
HTTP란?
HTTP(Hyper Text Transfer Protocol)란 하이퍼텍스트 문서를 교환하기 위해 만들어진 protocol입니다. 웹상에서 네트워크 서버끼리 통신을 할 때 어떠한 형식으로 통신을 하자고 정해놓은 "통신 형식/구조"로 보면 됩니다. TCP/IP 방식과 UDP 방식을 이용하여 통신하고 있습니다.
HTTP 통신 방식
기본적으로 HTTP 통신은 response와 request로 나뉘어져 있습니다. 클라이언트가 HTTP 요청을 서버로 보내는 것을 request라고 합니다. 그 후에 서버는 요청을 받아 결과를 응답합니다. 이 것을 response라고 합니다.
흐름을 자바와 스프링 프레임워크로 작성된 코드를 통해 확인해 봅시다.
// 회원 가입 api
@PostMapping
public ResponseEntity<JoinResponse> register(@Valid @RequestBody final JoinRequest memberDTO) throws DuplicateMemberException {
Member member = memberDTO.toEntity();
URI uri = URI.create("/members/findByEmail");
return ResponseEntity.created(uri).body(memberService.signUp(member));
}
해당 코드를 보면 먼저 RequestBody를 통해 클라이언트의 요청을 객체로 받아오고 비즈니스 로직 수행 후 완성된 결과를 응답하는 흐름입니다.
만약 이메일, 이름 생년월일, 비밀번호 같은 로직을 보내면 그에 대한 로직이 수행 후 응답이 오는 겁니다. 그러면 정확히 API 문서를 통해 살펴보겠습니다.
Request
POST /members/join HTTP/1.1
Content-Type: application/json;charset=UTF-8
Content-Length: 90
Host: localhost:8080
RequestBody
{
"email": "ssar@naver.com",
"password": "123456789",
"name": "ssar",
"nickname": "ssss",
"age": 23
}
Response
HTTP/1.1 201 Created
Location: /members/findByEmail
Content-Type: text/plain;charset=UTF-8
Content-Length: 14
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
ResponseBody
{
"email": "ssar@naver.com"
}
문서를 통해 하나의 흐름을 살펴보았습니다. 그러면 이 내부 구조에 대해 의문이 생길 것입니다. 저게 다 무엇일까?
하나하나 살펴보겠습니다.
HTTP 구조
먼저 Request 부분의 구조를 파헤쳐 봅시다. Request는 총 3가지로 나뉩니다.
- start line
- headers
- body
먼저 start line은 말 그대로 가장 첫번 째 줄입니다.
POST /members/join HTTP/1.1
HTTP 메서드와 Target이 되는 경로 그리고 HTTP 버전이 기록 되어 있습니다.
두 번째는 Header 입니다. 보통 요청에 대한 자세한 정보가 담겨 있고 key : value 형태로 저장되어 있습니다. 쿠키나 Accept, Host 정보, Content-Type등 많은 정보들이 존재합니다.
Content-Type: application/json;charset=UTF-8
Content-Length: 90
Host: localhost:8080
HOST : 요청이 전송되는 host url을 가리킵니다. 보통 google.com이 해당 host url이라고 생각하시면 됩니다.
Accept : 해당 요청이 받을 수 있는 응답 타입을 가리킵니다. 보통 application/json을 사용합니다. (GET 요청 시 사용)
Content-Type : 해당 요청에 들어오는 메시지 타입을 가리킵니다. 현재 Json으로 받고 있습니다. 그렇기에
application/json 을 사용하면됩니다.
Connection : 해당 요청이 끝난 후에도 계속해서 Connection이 유지할 것인지 끊을 것인지 나타냅니다. keep-alive와
close 옵션 두 가지가 있습니다.
Content-Length : 메시지 body의 길이를 나타냅니다.
Keep - alive란?
HTTP는 기본적으로 stateless한 방식으로 동작합니다. 전체적인 흐름을 살펴보면 다음과 같습니다.
1. TCP 통신을 위해 3way handshake를 통해 논리적으로 syn, ack를 통해 신뢰성을 확인합니다.
2. 통신이 완료되면 IP 패킷을 TCP 패킷으로 감싼 후 데이터를 서버로 전송합니다. 그리고 서버는 데이터를 받아 응답을
줍니다.
3. 그 후에 처리가 끝나면 4 way handshake를 통해 연결을 헤제하고 끝냅니다.
이 경우 최소한의 연결을 유지할 수 있기 때문에 많은 요청이 들어오더라도 처리가 가능하다는 장점이 있습니다. 또한 사용자 정보는 JWT나 Session 쿠키를 이용해서 유지할 수 있습니다.
하지만 Resource가 많다면 계속해서 img, css 그리고 js 파일등을 넘겨줄 때 마다 많은 비용이 들어가는 것을 감수하여야 합니다.
이 때 사용하는 것이 keep-alive 옵션입니다. 이 옵션을 통해 지정된 시간 동안 연결을 끊지않고 연결된 상태를 유지할 수 있습니다. keep-alive의 time out 내 클라이언트가 재 요청하면 새로운 연결이 아닌 기존 연결된 것을 이용합니다. 그렇기 때문에 대량의 Resource를 유지할 수 있습니다.
Body에 대하여
requestBody와 responseBody는 위 예제 처럼 Json 형식으로 보통 보내집니다. Body에는 클라이언트가 직접 입력한 값이 들어갑니다. 그리고 데이터를 Json 객체로 보낸 후 Java는 역직렬화를 통해 Java 객체로 바꾸어 데이터를 다룹니다. 그리고 데이터를 처리 후에 자바의 Response객체를 직렬화 하여 Json 객체로 만들어 다시 ResponseBody에 담아 응답합니다.
Status Code
두 번째로 Response에 대해 파헤쳐 볼건데 Header와 Body 부분은 거의 비슷하기 때문에 생략했습니다.
Response에서 가장 주요한 파트는 status code 입니다. 보통 성공 시 200ok 나 201 created 204 noContent를 사용합니다. 그리고 실패 시 404 not found, 400 Bad Request, 그리고 401 UnAuthorization를 사용하고 서버 오류는 500 을 보냅니다.
HTTP/1.1 201 Created
상태 코드에 대한 자세한 내용은 다음을 확인 하시기 바랍니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Status
Reference.
https://ijbgo.tistory.com/m/20
- Total
- Today
- Yesterday
- 코드
- java
- 면접
- swarm
- 자바
- 프로그래밍
- DB
- 게시판
- 백엔드
- CS
- Kotlin
- 취준
- 동시성
- 개발
- 취업
- docker
- MySQL
- IT
- JPA
- 취업준비
- Redis
- Spring
- 개발자
- DevOps
- 면접준비
- 인터뷰
- thread
- 면접 준비
- 코딩
- 프로젝트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |