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
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 {
String requestLine = request.getMethod();
requestLine += " " + request.getRequestURI();
String queryString = request.getQueryString();
requestLine += queryString == null ? "" : "?"+queryString;
requestLine += " " + request.getProtocol();
System.out.println(requestLine);
Enumeration<String> e = request.getHeaderNames();
while (e.hasMoreElements()) {
String name = e.nextElement();
System.out.println(name + ":" + request.getHeader(name));
}
final int CONTENT_LENGTH = request.getContentLength();
if(CONTENT_LENGTH > 0) {
byte[] content = new byte[CONTENT_LENGTH];
InputStream in = request.getInputStream();
in.read(content, 0, CONTENT_LENGTH);
System.out.println();
System.out.println(new String(content, "utf-8"));
}
}
}
[실행결과]
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