HTTP

1. 프로토콜(protocol) 이란?

서로 간의 통신을 위한 약속, 규칙을 의미한다.
주고 받을 데이터에 대한 형식을 정의하는 것이다.

2. HTTP(Hyper Text Transfer Protocol) 란?

HTTP는 텍스트 기반 프로토콜이다.

HTTP의 특징

  • 단순하고 읽기 쉽다. (Human Readable)
  • 상태를 유지하지 않는다. (stateless - 클라이언트 정보를 저장하지 않는다. → 보안하기 위해서 쿠키와 세션을 사용)
  • 확장 가능하다. (커스텀 헤더 추가 가능)

3. HTTP 메시지

편지와 비슷하다고 생각하면 된다.
편지처럼 Header와 Body로 구성되어 있다.
요청 편지를 보내고, 응답 편지를 보내는 것과 비슷하다고 생각하면 된다.
브라우저로 URL을 입력 후 전송하면, 요청 메시지를 만들어 전송하는 것이라고 생각하면 된다.

[요청 메시지]
GET /ch2/hello HTTP/1.1

Host : 111.22.33.44:8080
Connection: keep
alive
Cache
Control: max age=0
Accept
Encoding: gzip , br
[응답 메시지]
HTTP/1.1 200 OK

Content
Length : 44
Content
Type : text/html
Date : Sat, 20 Oct 2021 19:03:38 GMT
<html>
<head></head>
<body>Hello</body>
</html>

4. HTTP 메시지 - 응답 메시지

HTTP 응답 메시지 형식(format)이다.
상태라인과 헤더는 붙여서 쓰지만, 바디와는 빈 줄을 통해서 구분을 짓는다.
아래와 같은 형식으로 응답을 줘야 클라이언트가 응답을 이해할 수 있다는 뜻이다.

HTTP/1.1 200 OK

Content
Length : 44
Content
Type : text/html
Date : Sat, 20 Oct 2021 19:03:38 GMT

year=2021&month=10&day=1
상태코드 의미
1xx Information
2xx Success
3xx Redirect
4xx Client Error
5xx Server Error

5. HTTP 메시지 -요청 메시지

[GET 방식]

Server의 Resource를 얻어올려고 하는 것이다.
Read를 위한 것이기에 Body가 없다.
data를 보낼 것이 있으면, 요청라인에 쿼리스트링으로 data를 보낼 수 있다.

GET/getYoil?year=2021&month=10&day=1 HTTP/1.1

Host: 111.22.33.44:8080
User
Agent: Mozilla/5.0 (Windows NT 10.0)
Accept : text/html
Connection: keep
alive
[POST 방식]

서버에 전송할 data를 Body에 담고 있다.
Body에 내용들이 들어간다.
Write를 하기 위한 것이라 생각하면 된다.
글쓰기, 로그인, 회원가입, 파일 첨부 등이 있다.

POST/getYoil HTTP/1.1

Host: 111.22.33.44:8080
User
Agent: Mozilla/5.0 (Windows NT 10.0)
Accept : text/html
Connection: keep
alive

year=2021&month=10&day=1

6. HTTP 메서드 - GET, POST

GET POST
- 서버의 리소스를 가져오기 위해 설계
- QueryString을 통해서 데이터를 전달(소용량)
- URL에 데이터가 노출됨 (보안에 취약)
- 데이터 공유에 유리

ex. 검색엔진에서 검색단어 전송에 이용
- 서버에 데이터를 올리기 위해 설계
- 전송 데이터 크기에 제한이 없음 (대용량)
- 데이터를 요청 메시지의 Body에 담아 전송
- 보안에 유리 (HTTP+TLS = HTTPS), 데이터 공유에는 불리

ex. 게시판에 글쓰기, 로그인, 회원가입

7. 텍스트 파일과 바이너리 파일

바이너리 파일 : 숫자문자가 저장되어 있는 파일, 데이터를 있는 그대로 읽고 쓴다.
텍스트 파일 : 문자만 저장되어 있는 파일, 숫자를 문자로 변환 후 쓴다.

파일 종류 쓰기 읽기
바이너리 문자 → 문자
숫자 → 숫자
문자 → 문자
숫자 → 숫자
텍스트 문자 → 문자
숫자 → 문자
문자 → 문자
숫자 → 문자

8. MIME(Multipurpose Internet Mail Extensions)

텍스트 기반 프로토콜에 바이너리 데이터 전송하기 위해 고안되었음

HTTP의 Content Type 헤더에 사용, 데이터의 타입을 명시한다.
더 많이 있지만 기본적으로 몇 개만 적어있다.

타입 설명 MIME타입 예시(타입/서브타입)
text 텍스트를 포함하는 모든 문서 text/plain, text/html, text/css, text/javascript
image 모든 종류의 이미지 image/bmp, image/webp
audio 모든 종류의 오디오 파일 audio/midi, audio/mpeg, audio/webm , ogg, audio/wav
video 모든 종류의 오디오 파일 video/webm , ogg
application 모든 종류의 이진 데이터 application/octetstream, application/pkcs12,
application/vnd.mspowerpoint,
application/xhtml+xml, application/xml, application/pdf
[RequestHeader.java]
package com.fastcampus.ch2;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RequestHeader {
    @RequestMapping("/requestHeader")
    public void main(HttpServletRequest request) {

        Enumeration<String> e = request.getHeaderNames();

        while (e.hasMoreElements()) {
            String name = e.nextElement();
            System.out.println(name + ":" + request.getHeader(name));
        }
    }
}
[출력결과]
INFO : com.fastcampus.ch2.HomeController - Welcome home! The client locale is ko_KR.
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/ch2/RequestHeader] in DispatcherServlet with name 'appServlet'
host:localhost:8080
connection:keep-alive
sec-ch-ua:"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"
sec-ch-ua-mobile:?0
sec-ch-ua-platform:"Windows"
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site:none
sec-fetch-mode:navigate
sec-fetch-user:?1
sec-fetch-dest:document
accept-encoding:gzip, deflate, br
accept-language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
[RequestMessage.java]
package com.fastcampus.ch2;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class RequestMessage {
    @RequestMapping("/requestMessage")
    public void main(HttpServletRequest request) throws Exception {

        // 1. request line
        String requestLine = request.getMethod();       // GET 또는 POST
        requestLine += " " + request.getRequestURI();   // /ch2/requestMessage

        String queryString = request.getQueryString();  // year=2021&month=10&day=1
        requestLine += queryString == null ? "" : "?"+queryString;  
        requestLine += " " + request.getProtocol();     // HTTP/1.1
        System.out.println(requestLine);        


        // 2. request headers
        Enumeration<String> e = request.getHeaderNames();

        while (e.hasMoreElements()) {
            String name = e.nextElement();
            System.out.println(name + ":" + request.getHeader(name));
        }

        // 3. request body - POST일 때만 해당, GET은 body가 없음(CONTENT_LENGTH=0)
        final int CONTENT_LENGTH = request.getContentLength();
//        System.out.println("content length="+CONTENT_LENGTH);

        if(CONTENT_LENGTH > 0) { // body가 있을 때
            byte[] content = new byte[CONTENT_LENGTH];

            InputStream in = request.getInputStream();
            in.read(content, 0, CONTENT_LENGTH);

            System.out.println(); // empty line
            System.out.println(new String(content, "utf-8")); // year=2021&month=10&day=1
        }  // if
    } // main
}
[실행결과]
GET /ch2/requestMessage HTTP/1.1
host:localhost:8080
connection:keep-alive
cache-control:max-age=0
sec-ch-ua:"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"
sec-ch-ua-mobile:?0
sec-ch-ua-platform:"Windows"
upgrade-insecure-requests:1
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site:none
sec-fetch-mode:navigate
sec-fetch-user:?1
sec-fetch-dest:document
accept-encoding:gzip, deflate, br
accept-language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

9. Base64

base64는 64진법이라는 뜻이다. (2진법은 base2, 10진법은 base10, 16진법은 base16)
바이너리 데이터를 텍스트 데이터로 변환할 때 사용한다.
64진법은 '0'

' 9','A'

'Z', a'~'z 모두 64 개 (6 bit)의 문자로 구성

[Base64 색인표]
문자 문자 문자 문자
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

참고 : Wikipedia

'etc' 카테고리의 다른 글

PowerMockup  (0) 2023.06.05
디자인 패턴과 프레임워크  (0) 2023.02.02
JSON  (0) 2022.12.26
HTTP 요청과 응답  (0) 2022.08.21
클라이언트와 서버  (0) 2022.08.18

+ Recent posts