2-8 텍스트와 바이너리, MIME, Base64

서현우·2022년 5월 11일
0

스프링의정석

목록 보기
8/85

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

바이너리 파일

  • 문자와 숫자가 저장되어 있는 파일
  • 데이터를 있는 그대로 읽고 쓴다

텍스트 파일

  • 문자만 저장되어 있는 파일
  • 숫자를 문자로 변환 후에 쓴다.

8. MIME(Multipurpose Internet Mail Extensions)

텍스트 기반 프로토콜에 바이너리 데이터를 전송하기 위해 고안.
HTTP의 Content-Type헤더에 사용.
데이터의 타입을 명시.

text : text/html ...
image : image/bmp ...
audio : audio/mpeg ...
video : video/webm ...
application : application/xml ...

이미지 파일 전송 요청(Request) 메세지

(Postman으로 확인)

POST /ch2/getYoil HTTP/1.1
Host: localhost
Cache-Control: no-cache

//----경계(boundary)로 텍스트와 바이너리 데이터를 구분
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="year"

2021
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="imgFile"; filename="dice1.jpg"
Content-Type: image/jpeg


----WebKitFormBoundaryE19zNvXGzXaLvS5C

RequestHeader.java

RequestHeader의 내용 전체를 보여주는 코드

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) {
		
		//헤더의 name을 Enumeration e로 참조
		Enumeration<String> e = request.getHeaderNames();

		//반복문으로 헤더의 name을 하나씩 꺼내서 String name에 저장
		//"헤더 이름 : 헤더 내용"을 출력
		while (e.hasMoreElements()) {
			String name = e.nextElement();
			System.out.println(name + ":" + request.getHeader(name));
		}
	}
}

RequestMessage.java

GET/POST 요청 메세지 전체를 출력

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) {
			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
}

8. Base64

2진법 base2 : 0, 1
10진법 base10 : 0 ~ 9
16진법 base16 : 0 ~ 9, ABCDEF
64진법 base64 : A ~ Z, a ~ z, 0 ~ 9, +, /

Base64 인코딩

  • 6비트씩 잘라서 모두 64개의 문자로 구성
  • 바이너리 데이터를 텍스트 데이터로 변환할 때 사용
    (사이즈가 커지는 단점이 있다.)
  • ASCII 7bit에서 특수문자를 제거하면 6bit.
  • 어떤 문자던 공통으로 6bit를 가지고 있으므로 모든 문자 표현 가능
  • 안전하게 데이터를 주고받을 수 있다.
profile
안녕하세요!!

0개의 댓글