지식 정리/JAVA

Http Request, metod, header, response, MIME

27200 2024. 7. 6. 14:58

HTTP

HTTP(HyperText Transfer Protocol)은 W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3부터는 UDP를 사용하며, 80번 포트를 사용한다.

OSI 7 Layer에서 Application Layer에 위치한다.(사람이 읽을 수 있는 수준의 프로토콜이기 때문이다.)

HTTP는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response)프로토콜이다. 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통하여 서버로부터 웹페이지(HTML)이나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. 이 정보가 모니터와 같은 출력 장치를 통해 사용자에게 나타나는 것이다.

대표적인 특징으로는 SATELESS하다는 것이다.

Http Request

https://hahahoho5915.tistory.com/62

Request는 3가지 부분으로 구분된다.

  • Start Line: 메세지의 시작 부분으로 다시 세가지 부분으로 구성된다.
    • HTTP Method: 요청의 의도를 담고 있는 GET, POST, PUT, DELETE등 의 부분이다.
    • Request target: HTTP Request가 전송되는 목표 주소이다.
    • HTTP version: version에 따라 Request 메시지 구조나 데이터가 다를 수 있어서 verision을 명시한다.
  • Headers: 해당 request에 대한 추가 정보를 담고 있는 부분이다. 키 밸류 형태로 구성되어있다.
    • Host: 요청하려는 서버 호스트 이름과 포트번호
    • User-agent: 클라이언트 프로그램 정보. 이 정보를 통해 서버는 클라이언트 프로그램에 맞는 최적 데이터를 보내줄 수 있다.
    • Refer: 직전에 머무른 웹 링크 주소
    • Accept: 클라이언트가 처리 가능한 미디어 타입 종류 나열
    • If-Modified-Since: 여기에 쓰여진 시간 이후로 변경된 리소스 취득. 페이지가 수정되었으면 최신 페이지로 교체한다.
    • Authorization: 인증 토큰을 서버로 보낼 때 쓰이는 Header
    • Origin: 서버로 Post요청을 보낼 때 요청이 어느 주소에서 시작되었는지 나타낸다. 이 값으로 보낸 주소와 받는 주소가 다르면 CORS 에러가 발생하는 것이다.
    • Cookie: 쿠키 값이 key-value로 표현된다.
  • Body: HTTP Request가 전송하는 데이터를 담고 있는 부분으로 전송하는 데이터가 없다면 Body 부분은 비어있다.

HTTP Response

https://hahahoho5915.tistory.com/62

HTTP Resonse는 request와 동일하게 공백을 제외한 3가지 부분을 갖는다.

  • Status Line
    • HTTP 버전: 서버가 사용하는 HTTP 버전이다.
    • 상태 코드: 요청이 성공했는지, 실패했는지 등을 나타내는 코드이다.
    • 상태 메시지: 상태 코드에 대한 간단한 설명이다.
  • Headers: Request의 header와 동일하다. 대신 response에서만 사용되는 (User-agent 대신 Server)같은 헤더들이 있다.
  • Body: Response의 바디와 동일하다. 모든 응답에 바디가 있는 것은 아니며 불필요할 경우 비어있다.

HTTP Method

HTTP Method란 클라이언트 - 서버 구조에서 요청과 응답이 이루어지는 방식을 의미한다. 즉, 서버가 수행해야 할 동작을 지정하여 요청을 보내는 방법이다.

사용하는 이유는 리소스와 동작을 분리하기 위해서다. HTTP Method를 사용하면 서버가 수행해야 할 동작을 인식한 뒤, URI는 리소스만 식별하면 되기 때문이다.

  • GET

리소스를 조회하는 메서드다. GET요청은 멱등성이라는 개념을 갖고 있기에, 여러번 조회 요청을 하여도 결과가 변하지 않는다.

서버에서 클라이언트에게 데이터를 전달하는 경우, 쿼리 스트링을 통해서 전달한다. → 이때, 쿼리스트링은 클라이언트에게 전달하는 데이터 정보가 무방비로 노출되므로 주의해야 한다.

  • POST

주로 새로운 리소스를 생성하는데 사용되며 성공적으로 작동하면 201(Created) HTTP 응답을 반환한다.

데이터를 메세지 바디에 쿼리 파라미터 형식으로 전달한다. 쿼리 파라미터는 키 - 밸류 형식으로 작성되어 있다.

GET 방식과 대조적으로 데이터가 외부로 노출되지 않으므로, 보안상의 이점이 있다.(login같은 것은 POST를 이용해야 한다.)

POST로도 조회가 가능하긴 하나, 멱등성을 지니지 않기 때문에 동일한 결과를 보장받지 못한다. 또한 GET 메서드는 캐싱을 이용하므로, 조회 속도 또한 POST 메서드에 비해 우수하다.

데이터를 전송할 때 Body에 담아 전송하므로, 메세지의 길이 제한이 없으며 RadioButton같은 객체들의 값도 전송할 수 있다.

  • PUT

리소스를 완전히 대체하는 개념(덮어쓰기)

클라이언트가 리소스를 식별할 수 있다. → 클라이언트가 구체적인 위치를 아는 상태에서, URI를 지정한다.

  • PUT /posts/1 → 1번 게시글 수정 요청

이는 부분 수정이 불가능하며 멱등성을 지닌다.

  • PATCH

PUT과 같이 리소스를 수정하는 역할이지만, 리소스를 부분 변경한다는 점에서 차이가 있다.

  • 데이터에 A,B 가 있다고 하자. PUT의 경우 이 모든 것을 바꾸는 동작밖에 할 수 없다. A, B → C로 변경
  • PATCH의 경우 A,B → A, C로 변경 가능

멱등성을 지니지 않는다.

  • DELETE

리소스를 제거하는 역할이며 멱등성을 지닌다.

MIME

MIME란 Multipurpose Internet Mail Extensions의 약자이다. 즉 파일 변환이다.

MIME는 이메일과 함께 동봉할 파일을 텍스트 문자로 전환해서 이메일 시스템을 통해서 전달하기 위해서 개발되었다고 한다. → 현재는 웹을 통해서 여러 형태의 파일을 전달하는데 사용되고 있다.

  • 사용하는 이유?

이 전에 텍스트 파일을 주고 받는데에는 ASCII로 공통된 표준만 따르면 문제가 없었다. 하지만 음악파일, 영상파일과 같은 바이너리 파일을 보내는 일이 많아졌고 기존 시스템에서 문제 없이 전달하기 위해서 텍스트 파일로 변환이 필요하게 되었다.

MIME로 인코딩한 파일은 Content-type 정보를 파일의 앞 부분에 담게 되고 Content-type는 여러가지 타입이 존재한다.

  • Content-type?

클라이언트 브라우저로 어떤 리소스를 보낼 때 웹 서버는 일련의 HTTP 헤더로 파일이나 자원을 포함하는 바이트의 스트림을 앞에 보낸다. 이러한 헤더는 클라이언트에게 웹 서버와 커뮤니케이션 세부사항을 묘사한다.

브라우저가 데이터를 나타내는데 어떤 종류의 파일 스트림인지 알 수 있게 해주는 것이다.