본문 바로가기

Today I Learned

HTTP 1.1) http통신, stateless, mime 타입

기본적으로 통신을 하기 위해서는 두개의 대상에 스트림(stream)이 연결되어야 한다.

*바이트 스트림이라고 하며, 8bit(문자 하나)가 왔다갔다 하면서 통신을 한다.

A는 클라이언트이고 B는 서버이다.

A가 B에게 데이터를 쏘는 스트림은 write 하겠다는 뜻이고

B가 A에게 데이터를 쏘는 스트림은 read 하겠다는 뜻이다.

하나의 스트림은 write, 하나의 스트림은 read. 이것이 일반적인 통신이다.

 

B가 데이터를 가지고 있는 갑, 서버라면 B는 A가 궁금하지 않다.

A가 B가 가지고 있는 데이터를 가져오고 싶어서 B에게 스트림을 연결하고 데이터를 요청하게 된 것이며,

이것에 대해 B는 응답을 하게 된다. 

이렇게 데이터를 요청하는 A는 클라이언트이고 데이터를 응답하는 B는 서버이다.

서버는 클라이언트에게 데이터를 달라고 요청할 일이 없기 때문에 A가 응답할 일은 없다.

서버가 클라이언트에게 데이터를 응답해주는 구조를 HTTP 구조라고 부르며,

http 통신을 할 때는 어떠한 약속이 필요한데, 이 수많은 약속된 통신의 방법에는 네가지가 있다.

(클라이언트가 데이터를 요청할 때 사용하는 방법)

  • GET
  • POST
  • PUT
  • DELETE

 

GET은 데이터를 줘!

클라이언트는 서버에게 데이터를 달라는 요청으로 GET 요청을 사용한다.

서버는 SELECT라는 SQL문을 실행하며 클라이언트에게 데이터를 전송해준다.

 

POST는 데이터를 추가해줘!

내가 만약 회원가입을 하게되면 웹브라우저에 나의 정보를 적게 된다(이름, 주소 등등...)

그 다음 요청의 방법으로 내 데이터를 던져주고 서버는 그것을 자신의 데이터베이스에 저장하게 되는데

이 때 POST 요청을 사용하며, 서버는 INSERT 문을 실행한다.

 

PUT은 데이터를 수정해줘!

회원가입을 하면서 던져준 정보에서 주소가 틀렸다는 것을 알게 되었다.

이런 경우 PUT 요청을 해서 데이터를 수정해달라고 부탁할 수 있다.

PUT 요청을 받은 서버는 UPDATE 문을 실행한다.

 

DELETE는 데이터를 삭제해줘!

데이터를 삭제해달라는 DELETE 요청을 하면 서버는 DELETE라는 SQL문을 실행해서 삭제한다.

 

요청을 할 때, 어떤 데이터를 말하는 것인지 어떻게 알 수 있을까?

서버에게 스트림을 연결하고 요청을 할 때 클라이언트는 요청 뒤에 ?로 데이터의 정보를 추가적으로 줄 수 있다.

EX) 복숭아 데이터를 달라는 요청의 경우 > GET 요청 ? 복숭아

포도 데이터를 추가해달라는 요청의 경우 > POST 요청 ? 포도

 

 

stateful, stateless 방식

 

소켓 통신이란 포트 당 통신을 의미하며 두 개의 포트가 스트림으로 연결이 되어 통신을 한다.

서버 포트는 클라이언트 포트들과 통신을 위해 연결을 하고,

클라이언트들이 추가될 때마다 서버에 스트림이 계속 연결되기 때문에 서버는 굉장히 바빠진다. 

문서 전달이 목적인 http 통신은 그래서 이 방식을 사용하지 않고

클라이언트가 요청을 하고 서버가 그 요청에 응답하면 바로 연결된 선을(스트림을) 끊어버린다.

요청시마다 스트림을 연결해서 데이터를 주고받는 방식을 stateless 방식이라고 한다.

필요할 때마다 응답, 요청을 하고 선을 끊는다.

위에서 살펴본 요청하고 응답한 뒤 연결이 끊어지지 않고 지속되는 방식은 stateful 방식이다

연결이 지속되어 있기 때문에 계속 인증이 되어있는 상태라 세션이 만들어진다(데이터를 응답할 준비가 된다)

그래서 한번 연결되면 계속 데이터를 주고받을 수 있다.

http방식은 한번 인증이 되어도 선이 끊어지기 때문에 세션이 끊어지게 된다.

 

 

MIME 타입

클라이언트가 서버에게 요청을 할 때, 어떤 데이터에 대해 요청을 하는지 정보를 담아야 하는데,

데이터를 요청시에 헤더와 바디라는 것에 정보를 담는다.

헤더에는 데이터를 설명해주는 내용을, 바디에는 실제 데이터를 넣어서 보낸다. 

다양한 데이터의 종류 중 어떤 데이터인지를 적는 방식을 MIME 타입이라고 한다.

 

데이터를 전송하는 통신에는 서킷 스위칭 방식과 패킷 스위칭 방식이 있는데, 

일반적으로 http 통신은 패킷 스위칭 방식을 사용한다.

 

서킷 스위칭 방식이란?

A와 B가 데이터를 교환할 때, a,b,c,d 라는 데이터가 있으면

A는 a,b,c,d 데이터를 한방에 실어서 B에게 전송한다. 이런 방식을 서킷 스위칭 방식이라고 한다.

만약 C도 데이터를 올리고 싶어하면 선이 추가적으로 B에게 연결되어야 하는데,

이렇게 계속 선이 추가적으로 연결되어야 하기 때문에 비용이 많이 드는 단점이 있다. 대신 속도가 빠르다.

 

패킷 스위칭 방식이란?

A가 B에게 데이터를 보낼 때, a,b,c,d 데이터라면 a하나/b하나/c하나/d하나 이렇게 데이터를 쪼갠다.

이렇게 쪼갠 조각을 패킷이라고 하며 이 조각 하나하나를 올려서 하나씩 순서대로 전송하는 것이다.

C가 추가로 데이터를 올리고 싶어하면 선이 추가적으로 연결되는게 아닌, A와 선이 연결되게 되는데

이렇게 데이터를 전송하게 되면 A와 C가 보내는 데이터가 섞이게 된다.

섞인 데이터를 받은 B 입장에서는 받은 데이터를 조립해야 한다.

그래서 조립을 위해서 모든 패킷에는 헤더가 붙어서 전송하게 된다.

A가 보낸 데이터인지, C가 보낸 데이터인지 알려주는 표지가 헤더이고, 실제 데이터는 바디라고 한다.

 

즉, 나의 데이터를 전송하기 위해 내 데이터에 대한 설명인 헤더와 바디가 필요하며

어떤 데이터인지 데이터의 종류를 적는 방식을 MIME 타입이라고 한다.

 

MIME 타입이란 클라이언트에게 전송된 문서의 다양성을 알려주기 위한 메커니즘입니다: 웹에서 파일의 확장자는 별  의미가 없습니다. 그러므로, 각 문서와 함께 올바른 MIME 타입을 전송하도록, 서버가 정확히 설정하는 것이 중요합니다. 

 

mime 타입의 일반적인 구조는 type/subtype이다.

  • text/plain → 문자인데 일반적인 문자다
  • text/html → 문자인데 html 문서이다
  • image/jpeg → 이미지인데 jpeg 확장자이다
  • image/png → 이미지인데 png 확장자이다

https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

 

MIME 타입의 전체 목록 - HTTP | MDN

다음은 일반적인 확장자로 정렬된, 문서 타입과 관련된 MIME 타입의 포괄적인 목록입니다.

developer.mozilla.org

 

'Today I Learned' 카테고리의 다른 글

자바 GUI 기초 - JFrame, JLabel, JPanel  (0) 2022.10.29
File Class - write/read  (0) 2022.10.29
스프링부트 프로젝트 생성하기 / 실행 error 해결하기  (0) 2022.01.12
oauth의 동작원리  (0) 2022.01.09
awt 라이브러리  (0) 2022.01.08