HTTP 요청과 응답

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

 서로 간의 통신을 위한 약속, 규칙 ( 주고받을 데이터에 대한 형식을 정의한 것 )
실생활예) 야구의 감독과 선수 싸인,  편지봉투의 보내는사람, 받는사람, 우표붙이는 위치

 

2. Http(Hyper Text Transfer Protocol)란?

① 단순하고 읽기 쉽다.  ( 텍스트 기반의 프로토콜 )
② 상태를 유지하지 않는다. ( sateless 상태가 없다 ) 클라이언트 정보를 저장 x
   ㄴ sateless 보완을위해 사용하는 것 ( 쿠키 & 세션 )
 확장가능하다.  - 커스텀헤더 (header) 추가기능

 

3. Http 메세지

 

4. Http 응답메세지

상태코드분류표
1 xx ( 100번대 ) Informational 클라이언트와 서버의 정보교환 목적
2 xx ( 200번대 ) Success 성공
3 xx ( 300번대 ) Redirect 다른 URL 요청
4 xx ( 400번대 ) Client Error 에러 ( 404... 요청을 잘못함)
5 xx ( 500번대 ) Server Error 에러  ( 서버처리중 에러 )

 

5. Http 요청메세지 

 

6. Http 메서드 - GET & POST

 

GET

POST

 
서버의 리소스를 가져오기 위해 설계 ( READ 읽기 )
Query STring을 통해 데이터 전달, 주소표시줄 ( 소용량 )
URL에 데이터 노출되므로 보안에 취약
데이터 공유에 유리

ex. 검색엔진에서 검색단어, 링크... 전송에 이용


서버에 데이터를 올리기 위해 설게됨 ( Write 쓰기 )
전송 데이터 크기의 제한이 없음 ( 대용량 )
데이터를 요청 메세지의 body에 담아 전송
보안에 조금더 유리, 데이터 공유에는 불리 

ex. 게시판 글쓰기, 로그인, 회원가입, 파일업로드...

 

<form> 태그 사용하지 않고, post & get 방식 확인위해 크롬확장프로그램 설치

 

 

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

텍스트파일      : 문자만 저장되어있는 파일
바이너리 파일 : 문자와 숫자가 저장되어 있는 파일

※ 텍스트파일 & 바이너리파일 구분하는 방법
 텍스트파일로 열어 읽을수 있으면 텍스트파일,    없으면 바이너리 파일
파일종류 쓰기 (저장) 읽기
바이너리
(있는그대로 읽고씀)
문자 → 문자
숫자 → 숫자
문자 → 문자
숫자 → 숫자
텍스트
(숫자를 문자로 변환후 쓴다)
문자 → 문자
숫자 → 문자 (변환발생)
문자 → 문자
숫자 → 문자 ( 그럴일없음 )

 

8. MIME ( Multipurpose Internet Mail Extensions )

텍스트 기반 프로토콜에 바이너리 데이터를 전송하기 위해 고안
HTTP의 ContentType헤더에 사용
전송할 데이터의 타입을 명시
  타입 설명 MIME 타입 예시(타입/서브타입)
1 text 텍스트를 포함하는 모든 문서 text/plain, text/html, text/css, text/javascript
2 image 모든 종류의 이미지 image/bmp, image/webp
3 audio 모든 종류의 오디오파일 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
4 video 모든 종류의 비디오 파일 video/webm, video/ogg
5 application 모든 종류의 이진 데이터 application/octetstream, application/pkcs12,
application/vnd.mspowerpoint,application/xhtml+xml,
application/xml, application/pdf
6 ...등등 ...등등 ...등등
※ response.setContentType("text/html")


※ 요청 메세지 전체를 보여주는 예시
@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) {
			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
}

 

9. Base64  

 Bit (Binary Digit, 비트) - 컴퓨터(디지털시스템)에서 계산의 기본 단위 : 2진수 숫자 {0,1} .
 표현 가능 수 : 비트 수 N 이면 2N개
  Base 진법 표현
  Base64 64진법 A~Z ( 26개) ,
a~z (26개),
0~9 (10개),
+, / (2개)                   총 64개 2^6승 6비트
  Base2 2진법 0,1
  Base10 10진법 0~9
  Base16 16진법 0~9,   A,B,C,D,E,F

아스키코드란
?
 : 문자나 기호들을 컴퓨터가 이해할수 있는 신호로 만드는 것. ( 즉 복잡한 0,1 디지털신호로 변환하는 것 )

Base64 Binary Codes

Base64 인코딩사이트 https://www.base64encode.org/ 

Base64 인코딩
문자(원본) KTW        
과정
  16진수
변환
2진수
변환( 8421~)
Base64
(변환결과)
K 0x4B 0100 1011 S1RX
T 0x54 0101 0100
W 0x57 0101 0111


단점
원래는 문자당 4bit 인데, Bse64로 인코딩시  6bit씩 사용하므로 용량이 커짐.

장점
6비트(64진법)로 변환시, 서로 다른 os를 가진 PC끼리 데이터를 전송하더라도 문제가 없다.
 ( 문자체계까 다르더라도 괜츈 한글<>아랍어)
Web에서 문자 및 사진 전송시 별도 2번의 작업필요하여 비효율, 그러나 Base64변환시 한번에 (텍스트+사진)까지 보낼수 있어 효율적이다. (Html, Json )







바이너리 →  텍스트(html) 로 보내는 방법
① MIME타입사용하여 그대로 넣기
② Base64를 사용하여 바이너리를 텍스트로 변환 ( 사이즈가커짐 )

※ https://www.base64encode.net/   사이트에서 사진을 변환해줌

 

 


참고 :

남궁성, 스프링의 정석

+ Recent posts