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헤더에 사용
전송할 데이터의 타입을 명시
※ response.setContentType("text/html")
타입 설명 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/pdf6 ...등등 ...등등 ...등등
※ 요청 메세지 전체를 보여주는 예시
@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/ 사이트에서 사진을 변환해줌
참고 :
남궁성, 스프링의 정석
'Spring의 정석' 카테고리의 다른 글
SpringMVC 5 ( Servlet과JSP) (0) | 2023.03.08 |
---|---|
SpringMVC 4 ( 관심사의분리, MVC패턴 ) (0) | 2023.03.06 |
SpringMVC 2 (클라이언트와 서버) (0) | 2023.03.04 |
SpringMVC 1 (로컬 및 원격프로그램 실행, HttpServeltRequest ) (0) | 2023.03.04 |
Spring_환경설정2 ( AWS 서버구축 ) (0) | 2023.03.03 |