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 | / |
'etc' 카테고리의 다른 글
PowerMockup (0) | 2023.06.05 |
---|---|
디자인 패턴과 프레임워크 (0) | 2023.02.02 |
JSON (0) | 2022.12.26 |
HTTP 요청과 응답 (0) | 2022.08.21 |
클라이언트와 서버 (0) | 2022.08.18 |