Node.js를 사용하여 서버를 만들기 위해 API에 대해 공부하고, 이어서 HTTP에 대해서 공부했다.
개인적으로 이 HTTP가 지금까지 공부한 내용 중에서는 이해가 가장 어려운 것 같다. 단어 자체의 의미는 이해하지만, 실제로 요청하고 응답할 때의 메세지는 어디에서 생겨나는지, 실제 개발자가 정하거나 작성해야하는 부분은 어디부터 어디까지인지, 개발자가 정하거나 작성한 내용에 따라 자동으로 생성되거나 표시되는 부분이 있는지 등 전체적인 구조와 개발자의 손이 실제로 닿아야 하는 부분을 구분하는게 와닿지가 않는다.
접근을 잘못해서인지, 단순히 학습량이 적은건지도 알 수가 없어 답답한 상황이라 일단 지금까지 공부한 내용을 정리하고자 한다. 계속해서 구글링도 해보고, 유튜브에도 검색하면서 다시 정리를 해볼 생각이다.
HTTP란 'HyperText Transfer Protocol'의 준말로서, 하이퍼텍스트로 구성된 문서(HTML 문서)를 전송하기 위한 약속이다.
HTTP 통신의 핵심은 요청과 응답이라고 할 수 있다. 그리고 요청과 응답은 각각의 역할과 구조가 있다.
Request
요청은 프론트엔드(클라이언트)에서 백엔드(서버)에 데이터 처리를 시작하게 하기 위한 메시지이며, 크게 세 부분으로 나뉜다.
Start Line: 요청의 첫번째 줄
GET /login HTTP/1.1
- GET: HTTP 메소드로서 해당 요청의 의도한 액션(GET, POST, DELETE 등)
- /login: 요청의 타겟으로, 해당 요청이 도착하는 지점
- HTTP/1.1: 사용하는 HTTP의 버전(주로 1.1 사용)
Headers: 보내는 요청에 대한 추가 정보(메타 데이터)를 담고있는 부분
Headers: {
Host: www.apple.co.kr
User-Agent: chrome
Content-Type: application/json
Content-Length: 19203
Authorization: "asjdhfkjahsfdkj1029fjkasdhfkjaksjdnfkjahsdkjfasd"
}
- Host: 요청을 보내는 타겟의 주소
- User-Agent: 요청을 보내는 클라이언트의 정보(크롬, 파이어폭스 등)
- Content-Type: 해당 요청이 보내는 메세지의 body 타입 정보(예: application/json)
- Content-Length: body에 담기는 메세지의 길이
- Authorization: 회원의 인증/인가를 처리하기 위해 로그인 토큰이 담기는 속성
Body: 요청에 실제 내용을 담고 있는 부분이며, 주로 Body를 사용하는 HTTP 메소드는 POST 이다.
ex) 로그인 시에 서버에 보낼 요청의 내용
Body: {
"user_email": "user@gmail.com",
"user_password": "userPassword"
}
Response
응답은 요청과 마찬가지로 메세지이며, 백엔드에서 프론트엔드 쪽으로 향한다.
Status Line: 응답의 상태. 요청의 처리 상태로 내용을 시작함.
HTTP/1.1 404 Not Found
(해석: HTTP 1.1 버전으로 응답하고 있는데, 프론트엔드에서 보낸 요청(ex. 로그인 시도)에 대해서 유저의 정보를 찾을 수 없기 때문에(Not Found) 404 상태 메세지를 보냅니다.)
HTTP/1.1 200 SUCCESS
(해석: HTTP 1.1 버전으로 응답하고 있는데, 프론트엔드에서 보낸 요청에 대해서 성공했기 때문에 200 상태 메세지를 보냅니다.)
- HTTP/1.1: 사용하는 HTTP의 버전
- 404, 200: Status Code로 응답의 상태를 나타냄
- Not Found, SUCCESS: Status Message로 응답코드와 함께 응답여부를 메세지 형태로 나타냄
Headers: 요청의 헤더와 동일하게 응답의 추가 정보(메타 데이터)를 담고 있는 부분이다. 다만, 요청과 다르게 응답에서만 사용되는 헤더 정보가 있다.(User-Agent 대신 Server)
Body: 일반적으로 요청의 Body와 동일. 요청의 메소드에 따라 Body가 존재하지 않을 수 있는 것처럼 응답도 형태에 따라 데이터를 전송할 필요가 없는 경우에는 존재하지 않을 수 있다. 가장 많이 사용되는 Body의 데이터 타입은 JSON(Javascript Object Notation)이다.
ex) 로그인 요청에 대해 성공했을 때 응답의 내용
Body: {
"message": "SUCCESS",
"token": "kldiduajsadm@9df0asmzm" (암호화된 유저의 정보)
}
Stateless는 말그대로 상태가 없음을 뜻한다. 이는 각각의 HTTP 통신(요청/응답)은 독립적이기 때문에 과거의 통신에 대한 내용을 전혀 알지 못한다는 의미이다.
즉, 매 통신마다 필요한 모든 정보를 담아서 요청을 보내야한다는 것이다. 말로만 들었을 때는 실제 인터넷에서 이루어지는 작업들과 매칭이 안돼서 의문이 들었는데, 이는 필요에 따라 만들어진 것이라고 한다.(장바구니 기능을 위한 로그인 토큰, 브라우저 쿠키, 세션, 로컬스토리지 등)
지금까지 인터넷을 해오면서 너무나도 자주 봤던 단어인데 공부를 하면 할수록 더 어려운 느낌이 든다.
이 부분은 나중에 개발 업무뿐만 아니라 IT 분야에서 근무하는 동안에는 기본적으로 완벽하게 이해가 필요할 거라 생각되고 당장 몇 개월 뒤에 취업을 위해서라도 내 것으로 만들어야 할 것 같다.
모든 일에는 항상 기본이 중요한 만큼 염두에 두고 공부해야겠다.