- 텍스트와 바이너리, MIME, Base64
- MIME(Multipurpose Internet Mail Expressions)
- Base64
7. 텍스트와 바이너리, MIME, Base64
data는 크게 문자, 숫자로 되어 있다. 위 그림은 image.jpg를 메모장으로 읽은 것이다. 메모장은 text editor이므로 image.jpg를 text로 인식해서 보여준다. 파일이 text 파일인지 binary 파일인지 구분하는 방법은 메모장으로 열었을 때 읽을 수 있으면 text 파일이고 못 읽으면 binary 파일이다. 위 그림에서 문자 외에 깨진 것은 숫자라 보면 된다.
binary 파일은 문자는 문자, 숫자는 숫자로 쓰고 읽는다.
text 파일은 문자는 문자, 숫자는 문자로 변환해서 쓴다. 읽을 때는 전부 문자로 변환했기 때문에 숫자로 읽는 경우는 없다. 혹시 문자를 숫자로 바꾸는 경우는 없을까?
binary 파일은 data를 문자, 숫자 그대로 읽고 써 그대로 저장하면 된다. 변환이 따로 필요 없다.
text 파일은 숫자를 문자로 바꿔 숫자 12를 저장할 때 문자 "1" "2"로 바꿔서 저장한다. 숫자는 int형 4byte인데 2byte로 사이즈가 줄었다(Encoding이 UTF-8 가정하에) . float형인 12.625f는 "1" "2" "." "6" "2" "5" 문자 6개로 저장하기 때문에 4byte에서 6byte로 사이즈가 오히려 커졌다. 숫자를 문자로 바꿀 때는 크기에 장단점이 있다.
숫자를 문자로 변환 후 저장한다는 말은 binary 파일을 text 파일로 저장한다는 말과 같다. text 파일의 장점은 사람이 읽기 쉽고, binary 파일은 모두 숫자이기 때문에 사람이 읽기 어렵다.
8. MIME(Multipurpose Internet Mail Expressions)
MIME은 원래 E-mail에서 왔다. HTTP는 text기반으로 text형식밖에 전송하지 못할까? 그럼 이미지, 동영상은 binary 파일인데 브라우저에서 이 두 파일을 어떻게 전송할까? 이때 binary 파일을 HTTP Protocol에서 전송하기 위해 고안한 것이 MIME이다.
MIME은 전송할 data의 타입을 적어준다. 타입은 크게 text, image, audio, video, application이 있고 각각의 서브타입도 있다. response.setContentType("text/html")로 서브타입을 적어줘야 브라우저가 응답을 받았을 때 해석을 올바르게 할 수 있다. response.setContentType("image/jpeg")으로 적고 out.print("<html>")로 출력하면 브라우저는 보내준 내용이 HTML임에도 image로 해석한다. 제대로된 결과를 보여주지 못한다.
아무튼 HTTP Protocol에서도 binary 파일 전송이 가능하다. binary인지 text인지 구분하기 위해서 MIME 타입을 적는 것이다. HTTP의 Content-Type헤더에 사용한다.
postman이 POST요청에서 필요한 파일선택을 대신 만들어준다.
Preview를 누르면 요청 메시지를 간략히 볼 수 있다. 바디에는 우리가 입력한 text data인 year=2021과 binary data인 dice1.jpg가 있다. 이 전체가 POST 요청 메시지이고 text, binary data 둘 다 있어 boundary 경계 문자열을 둬서 구분한다.
postman의 Limitations 한계가 나오는데 크롬에서 자동으로 추가한 헤더는 preview에서 볼 수 없다는 말이다. 또 form-data의 내용을 볼 수 없다.
- RequestHeader 메서드(Header를 전부 출력하는 메서드)
RequestHeader는 요청 메시지의 헤더 정보를 전부 출력해 주는 프로그램이다. getHeaderNames 메서드가 Enumeration에 반환되어서 while문에 헤더를 하나 하나씩 찍은 것이다.
요청 메시지의 헤더는 대소문자를 구분하지 않는다.
- RequestMessage 메서드
body출력은 CONTENT_LENGTH > 0 일 때, 즉 body가 있을 때 출력한다.
getRequestURI( ) 메서드 정도만 알아두자.
GET요청은 body가 없어 heaer에서 끝난다. POST 요청은 한 줄이지만 body가 있다.
9. Base64
Base64는 64진법이다. 'A~Z' : 26개 + 'a~z' : 26개 + '0~9' : 10개 + '+', '/' 2개 = 총 64개이다. Base64는의 표를 보면 char 형식으로 문자이다.
Base64는 Data를 표현할 때 64개를 이용해서 표현한다. 64 = 2^6으로 6bit이다. Ma를 2진수로 변환하고 6bit 단위로 자르는 것이 Base64로 변환한 것이다. 뒤에 자리가 남으면 '0'으로 채우고, 6자리가 남으면 Padding 문자열을 넣는다. 자릿수를 맞추기 위해서 넣는다.
Base64를 왜 사용할까? binary text를 text data로 변환할 때 사용한다. ASCII는 128개 = 2^7, 7bit로 1bit가 더 많은 이유는 특수문자와 출력하지 못하는 글자를 포함한다. ASCII text로 변환하게 되면 개행문자가 OS마다 달라 안전하지 못하고 잘 못 출력될 가능성이 있다. 따라서 ASCII에서 사용할 수 없는 문자를 제외하고 출력할 수 있는 문자만 모은 것이 Base64이다. ASCII만 아니라 모든 인코딩은 적어도 6bit는 갖고 있다. 6bit 문자는 모든 인코딩에서 공통이다. Base64로 변환을 하면 서로 다른 OS를 가진 PC끼리 data를 주고받는데 문제가 없다.
Ma 문자는 8bit + 8bit = 16bit이고, Base64로 변환하면 6bit * 4 = 24bit로 data의 용량이 증가한다. 인코딩의 종류에 따라 문자 하나의 data 크기가 다를 수 있는데, UTF-8에서는 영문자, 숫자가 1byte이다. 1byte 8bit 문자 1개를 6bit 단위로 끊어 읽어, 33% data양이 증가한다. data양이 증가하는 대신 안전하게 data를 주고받을 수 있다. 주고받는 쪽의 문자체계가 다르기 때문에 가장 안전한 64개만 골라서 보내고 받는다. 따라서 Base64로 인코딩한다.
binary data를 text기반인 HTTP protocol에 보내는 방법이 2가지가 있다. MIME 타입을 쓰고 binary 파일 그대로 넘기든가 Base64를 이용해서 text data로 보낸다. 단점은 용량이 커진다.
왼쪽 이미지를 Base64로 인코딩하면 오른쪽과 같다. 이 문자열에는 A~Z, a~z, 0~9, + / 64개 밖에 없다. 다시 이를 디코딩하면 binary 파일이 된다.
Base64 Encode 사이트를 이용해서 Image를 Base64로 바꾼다.
text파일을 복사해서 vs code에서 <img src="data:image/jpeg;base64, >에 붙여 넣기 한다.
Dice 이미지가 출력되고 binary가 text로 html과 한 몸이 되었다. html에 link가 잘못되어 파일이 깨지는 경우가 많은데, 이미지를 Base64로 인코딩해서 text로 입력하면 링크가 깨지는 것을 막을 수 있다. 대신 용량이 늘어난다. VS code 코드 line 수만 보더라도 엄청나다.
'스프링의 정석 > Ch. 02 Spring MVC' 카테고리의 다른 글
ch2_10. 관심사의 분리와 MVC패턴 - 실습(1) (0) | 2023.04.12 |
---|---|
ch2_09. 관심사의 분리와 MVC패턴 - 이론 (0) | 2023.04.12 |
ch2_07. HTTP 요청과 응답 - 이론(1) (0) | 2023.04.12 |
ch2_06. 설정 파일 - server.xml, web.xml (0) | 2023.04.12 |
ch2_05. 클라이언트와 서버(3) (0) | 2023.04.12 |