예전에 내가 썼던 면접스터디에서 HTTP 내용이 나오는 블로그 글
면접 스터디때 레스트풀 api에 관련한 키워드가 나와서 공부를 하긴했는데, 당시에는 뭔소린지 하나도 모르겠었다...
그래서 오늘은 HTTP와 RESTful에 대해서 열심히 삽질을 해볼 까 한다!
이거 조금 저거 조금 알다보니깐 서로 연관지어서 생각하고 큰 그림 보는 능력이 떨어지는 것 같다...

고럼 오늘도 출발
하도 많이 봐서 약자 다외웠다!
사실 기본 개념들은 이미 알고있다.. 근데 이런 개념은 솔직히 몇번 안보고 있으면 금방 까먹기 마련이다.
Hpyertext Transfor 을 하는 네트워크 통신 규칙 덩어리(Protocol)
프로토콜은 컴퓨터나 장치들이 서로 통신할 때 지키기로 정해놓은 규칙이다.
HTTP(Hypertext Transfor Protocol) , TCP(Transmission Control Protocol) / IP(Internet Protocol) 등 컴퓨터나 다른 전자기기와 통신할 때 필요함!!!
없으면 서로 데이터를 주고받을 때 마다 언어나 데이터 포멧이 달라서 하나하나 번역해줘야한다.
우리는 현재 HTTP/1.1을 대부분 사용한다.
왜냐하면.., 으로 4가지 이유를 들 수 있다 ( 출처 )
1️⃣ 연결 상태 유지(Persistent Connection)

2️⃣ 파이프라이닝(Pipelining)
3️⃣ 호스트 정보 필수 (Host Header)
4️⃣ 프록시와 캐시 개선
💡 왜 HTTP/2, HTTP/3로 안 가는 걸까?
HTTP/2와 HTTP/3는 성능이 훨씬 좋지만, 완전히 새로운 방식이라서 기존 웹 서버와 클라이언트가 모두 업데이트되어야 한다.
HTTP/1.1이 이미 충분히 안정적이고, 대부분의 웹사이트가 이걸로도 큰 문제 없이 운영 가능하기 때문
그래도 요즘은 대형 웹사이트(aws, cloudflare 등)나 최신 웹 서비스들은 점점 HTTP/2, HTTP/3로 이동하고 있음!!HTTP의 진화과정

웹사이트에서 F12를 누르면 통신내역을 볼 수 있는데 여기서 HTTP의 버전도 확인이 가능하다!

네이버창인데 네이버도 H2가 훨씬많다,... 안쓰는건 아닌거같고
차근차근 옮겨가는??? 그런 분위기인가보다.

위에서 언급했다싶이, HTTP는 연결을 유지하지 않는 모델이다.
HTTP가 공통으로 제공하는 특징? 들을 간단하게 꼽아보겠다.
1️⃣ 클라이언트-서버 구조
HTTP는 클라이언트(브라우저)와 서버(웹 서버)가 서로 요청(Request)과 응답(Response)을 주고받는 방식
2️⃣ 📌무상태 (Stateless)
3️⃣ 비연결성 (Connectionless)
4️⃣ 텍스트 기반 프로토콜
5️⃣ Stateless하지만 확장 가능
6️⃣ 보안 (HTTP vs HTTPS)
📌무상태 (Stateless)
참고링크
Stateless 구조에서 서버는 단순히 요청이 오면 응답을 보내는 역할만 수행하며, 상태 관리는 전적으로 클라이언트에게 책임이 있는 것이다.
즉, 클라이언트와 서버간의 통신에 필요한 모든 상태 정보들은 클라이언트에서 가지고 있다가 서버와 통신할때 데이터를 실어 보내는 것이 무상태 구조이다.
장점 : 대량의 트래픽 발생 시에도 서버 확장을 통해 대처를 수월하게 할 수 있다
예시 : UDP(Client와의 세션 정보를 Server가 저장하지 않는다는 점에서 Stateless 하다), HTTP

보이는 것과 같이 요청과 반환의 기본 형태(4단계)는 같고, 안의 내용이 다르게 나온다.
참고링크
1️⃣ Start Line
HTTP 메시지는 요청(request) 또는 응답(response)으로 나뉨.
요청은 request-line, 응답은 status-line을 사용함.
🧡Request Line
💚Status Line
HTTP-version SP status-code SP reason-phrase CRLF2️⃣ Header Fields
필드 이름: 값 형식으로 작성됨. 3️⃣ Whitespace
Header Field는 모든 요청 메서드에서 필수로 오가는 내용이다. 그래서 알아둘 내용이 좀 더 많은데,
이 내용들을 요청 헤더와 응답 헤더로 나누어서 적어보겠다.
이건 줄글로 와라라라라 쓰다가 귀찮아져서 그대로 지선생께 표로 만들어달라고했음

제일 메인이되는 GET,POST,PUT,DELETE,PATCH는 잘 알아두자
📌멱등성(Idempotent)
- 한번을 호출하거나 수천번을 호출해도 항상 결과는 같다.
- 요청이 실패한 경우 재시도 하기위해 필요하다.
- 리소스 조회(GET Method) 재요청 중간에 변경된다면?
- 재요청 중간에 리소스가 변경되는것은 멱등성으로 고려하지 않는다.
Host : 요청하는 대상 서버의 도메인이나 IP 주소를 명시 Host: example.comUser-Agent : 클라이언트(브라우저, 앱 등)의 정보 제공. 웹사이트가 브라우저마다 다르게 동작할 때 참고됨Accept : 클라이언트가 수락할 수 있는 응답 콘텐츠 타입을 명시Accept: application/jsonAccept: text/html,application/xhtml+xml,application/xml;q=0.9Authorization : 인증 토큰을 포함하는 헤더 (JWT, Basic Auth 등). 로그인 인증이 필요한 API에서 필수Content-Type : 요청 본문의 데이터 형식을 지정 Content-Type: application/jsonReferer : 사용자가 어디서 왔는지 알려줌 Referer: https://www.google.com/Origin : 요청이 발생한 출처(도메인)를 나타냄 (CORS 관련)Accept-Encoding : 클라이언트가 지원하는 압축 방식 명시 -> 서버가 압축하여 응답하면 네트워크 성능 개선 가능사실 뭐라는진 잘모르겠음 Referer와 Origin의 차이점에 대해서도 좀 모호하고 ,.,.,.,,.,
1️⃣ 1xx (정보)
2️⃣ 2xx (성공)
3️⃣ 3xx (리다이렉션)
4️⃣ 4xx (클라이언트 에러)
5️⃣ 5xx (서버 에러)
서버 오류, 요청은 정상이지만 서버가 처리하지 못함
재시도하면 성공할 수 있다.
ex) 서버가 일정시간 다운되었다가 다시 살아난 경우
❗유의점
- 새로운 상태 코드가 추가되어도 변경할 필요가 없다.
- 디테일한 코드를 몰라도 몇 번대 코드인지만 알면 된다.
- 응답 코드를 상황에 맞게 잘 작성 해야 한다. 매우 기본이고 매우 중요하다.
Content-Type : 브라우저나 클라이언트가 응답을 어떻게 해석할지 결정Content-Type: application/json; charset=utf-8Content-Length : 응답 바디의 크기(바이트 단위)Cache-Control : 클라이언트 및 프록시의 캐싱 정책을 결정 (NMN초 동안 캐싱 가능 기재)Set-Cookie : 서버에서 쿠키를 설정하는 헤더. 여러 속성으로 보안 강화가능하다.Location : 리다이렉트 응답 시 이동할 URL을 지정 (3xx 상태 코드와 함께 사용됨)Access-Control-Allow-Origin :CORS 정책에 따라 요청을 허용할 도메인 지정 (특정 도메인만 허용할 수도 있음)ETag : 리소스의 버전(해시값 등)을 제공하여 변경 여부 확인 가능Server : 서버 소프트웨어 정보 제공.HTTP 라면 함께 RESTful이 나와야 정상인데.., 지금 7시다 이거 정리하는데 하루 다썼다. 원서도 보고 텍스트 읽는데 오래걸린 기분임...
할수잇는 만큼 다음(RESTful쓸예정) 게시글에 써보겠다!!
