간단한 HTTP
1. HTTP란?
HTTP - Hyper Text Transfer Protocol
말 그대로 Hyper Text 전송 통신 규약이다.
간단하게 컴퓨터들끼리 HMTL 파일을 주고받을 수 있도록 하는 약속이다.
2. HTTP 특징
-
HTTP는 Request(요청) 와 Response(응답)가 존재한다.
HTTP는 보내는 주체와 받는 주체가 있다.
사실 HTTP는 클라이언트에서 서버로 일을 시작하게 하기 위해 메시지를 보내는 것이다. -
Stateless(상태 없음)
각각의 HTTP통신은 *독립적* 이기 때문에 이전의 통신에 대한 내용을 알 지 못한다.
Youtube에서 동영상을 시청한다고 생각하자.
로그인을 우선 하고 신나는 힙합음악을 듣기 위해서 동영상을 클릭했는데, 로그인이 필요한 서비스라고 나온다.
잠시 오류가 있는가 싶어서 다시 로그인을 하니, 동영상을 고르라고 한다. 신나는 힙합음악을 다시 선택하니 다시 로그인을 해야한다고 나온다. 아주 환장하지 않겠는가?예시가 다소 이상하지만 HTTP는 과거에 내가 로그인을 했는지 어쨌는지 알 지 못한다. 이것이 Stateless 이다. 즉, 동영상을 보려면 로그인 정보와 동영상을 클릭했다는 정보를 한번에 보내줘야 한다.
쿠팡에서 이렇게 계속 로그인을 하면, 아마 사람들은 쿠팡을 이용하지 않을 것이다. 이런 불편함을 해결하기 위해서 로그인 토큰, 브라우저의 쿠키 등과 같은 기술이 만들어졌다. -
Request / Response 의 구조
요청은 크게 세 부분으로 구성되어 있다.- Start Line : 요청의 첫번째 줄에 해당하며 아래와 같은 정보가 들어간다.
HTTP Method : 해당 요청이 의도한 액션을 정의하는 부분. 주로 GET, POST, DELETE가 많이 쓰인다.
Request Target : 해당 Request가 전송되는 목표 URL
HTTP Version : 사용되는 HTTP 버전. 주로 1.1버전이 많이 쓰인다.
- Headers : 해당 요청에 대한 메타데이터를 담고 있다.
Key : Value 값으로 되어있다.
Host : 요청을 보내는 타겟의 주소. 요청을 보내는 웹사이트의 기본 주소가 된다.(유튜브, 쿠팡 등)
User-Agent : 요청을 보내는 클라이언트에 대한 정보(크롬, 사파리 등)
Content-tyep : 해당 요청이 보내는 메시지의 Body 타입(json 등)
Content-length : Body 내용의 길이
Authorization : 회원의 인증/ 인가를 처리하기 위해 로그인 토큰을 담는다. - Body
주로 Body를 사요하는 메소드는 POST다.
응답 또한 세부분으로 구성되어 있다.
-
Status Line : 응답의 상태 줄이다.
응답은 요청에 대한 처리상태를 Client에게 알려주면서 내용을 시작한다.
HTTP Version : 요청의 HTTP 버전과 동일하다.
Status Code : 응답 메세지의 상태 코드
Status Text : 응답 메세지의 상태를 간략하게 설명해주는 텍스트 -
Headers
요청의 헤더와 동일하다. 다만, 응답에서만 사용되는 헤더의 정보들이 들어있다. 예를 들면 User-Agent 대신 Server 헤더가 사용된다.
-
Body
요청의 바디와 일반적으로 동일하다.
요청의 메소도에 따라 Body가 항상 존재하지 않듯이 응답도 형태에 따라 데이터를 전송할 필요가 없을 수 있다.
가장 많이 사용되는 데이터 타입은 JSON이다.
- Start Line : 요청의 첫번째 줄에 해당하며 아래와 같은 정보가 들어간다.
-
위 요청과 응답의 코드를 간략히 표현하면 아래와 같다.
// (축약된 요청 메세지) GET /login HTTP/1.1 Headers: { "HOST": "https://www.example.com/kr", "Authroization": "adsnjfnaskjdf@!#22" (유저가 본인임을 증명할 수 있는 인증/인가 토큰) } // (축약된 응답 메시지) HTTP/1.1 200 SUCCESS Body: { "message": "SUCCESS", "users" : "Barney"
3. HTTP Methods, State Code
실제로 사용하는 메소드와 상태 코드는 아래와 같다. 자주 사용되는 것들만 기입해놨으니, 필요할 때마다 검색해서 사용해도 괜찮다 :)
- Method
- GET : 데이터를 받아오기만 할 때 사용
- POST : 데이터를 생성 / 수정할 때 주로 사용. 요청에 Body가 포함되서 보내진다.
- DELETE : 데이터를 삭제 요청 할 때 사용(장바구니에서 상품 빼기)
- State Code
- 200 OK : 주로 GET에 활용되는 OK 코드
- 201 CREATED : 주로 POST에 사용되는 코드
- 400 Bad Request : 주로 Request에서 바디의 내용이 잘못되었을 때 뜬다.
- 401 Unautuorized : 로그인 필요할 때 사용한다.
- 403 Forbidden : 권한이 없을 때 뜬다.
- 404 Not Found : 요청한 URL이 없을 때 뜬다. (홈페이지를 찾을 수 없습니다.)
- 500 Internal Server Error : 서버 터졌을 때 뜬다. 이러면 안된다 :)
추가글)
학습을 진행하던 중 400 이외의 에러를 보게 되어서 다시 한번 정리하기로 하였다.
4로 시작하는 오류는 클라언트쪽에서 잘못된 요청(보통)을 보내서 발생하는 에러이고, 500번대 오류는 올바른 요청이지만 서버에서 처리하는 과정 중 서버문제로 오류가 발생한 것이다.
아래는 300번대 에러들을 정리하였다.
4. X-Content-Type-Options, X-Frame-Options(+ MIME)
보통 서버 응답에 따른 결과 중 header 에 아래 두 가지의 내용이 설정되어 있다.
- X-Content-Type-Options : nosniff
- X-Frame-Options : DENY
이 두가지는 왜 설정되었는지, 또한 어떻게 사용되는지를 한번 간단히 알아보자.
우산 X-Content-Type-Options 부터 알아보자.
헤더에는 MIME(Multipurpose Internet Mail Extensions) 형식이 사용된다. 영어 이름에서 알 수 있듯이 원래는 메일 전송시 사용하던 인코딩 방식이다.
웹서버는 일반적으로 HTML 전송시에는 "text/html"이라는 MIME 형식으로 보낸다. 그외의 경우에는 대개 접근하는 파일의 확장자에 의해서 MIME 형식이 결정된다. 예를 들어 JPG 이미지는 "image/jpeg", CSS 파일은 "text/css", MPG 파일은 "video/mpeg" 등과 같다. 확장자가 기존 MIME 형식에 정의되어 있지 않을 경우에는 텍스트 문서이면 "text/plain"이 이진 파일이면 "application/octet-stream"을 사용한다.
웹서버가 보내는 MIME 형식을 이용하여 일부 보안 수준을 높이려는 시도가 바로 X-Content-Type-Options: sniff 헤더이다. 이 HTTP 헤더가 선언되면 지원하는 웹 브라우저의 경우에는 지정된 MIME형식 이외의 다른 용도로 사용하고자 하는 것을 차단한다.
예를 들어보자. 어떤 공격자가 .jpg 확장자의 파일을 웹 서버에 업로드했다고 하자. 실제로 이 파일은 JPEG 이미지가 아니라 내용은 자바스크립트르 담고 있다. 이 파일을 웹브라우저로 접근하면 웹서버는 확장자가 jpg이므로 image/jpeg라는 MIME 타입을 반환한다. 공격자가 이 이미지 파일을 자바스크립트로 사용하려고 할 때 웹서버가 X-Content-Type-Options: sniff 헤더를 함께 전송하면 웹브라우저는 이 파일의 MIME 형식이 text/javascript나 application/javascript가 아니므로 자바스크립트 실행을 차단한다.
CSS에서도 JavaScript를 실행할 수 있으므로 사용자가 업로드한 파일이 .css 확장자가 아니면 CSS로 적용하는 것도 차단한다 - 따라서 첨부파일 업로드에서 업로드를 허용할 확장자 목록에 css가 포함되면 안된다.
해당 내용은 아래 참고 블로그에서 발췌했다. 훨씬 자세하게 나와있으니, 해당 내용을 참고하자.
참고 블로그
X-Frame-Options 헤더는 보안목적으로 외부에서 FrameSet이나 iframe 요청에 의한 ClickJacking 공격에 대한 보호를 위해 사용하게 된다. 허용하지 않는 페이지에서 frame을 요청할 경우 사용하는 옵션에 따라서 비허용할 것인지, 허용할 것인지 결정 할 수 있게 된다. X-Frame-Options 옵션 값은 아래 3개로 구분된다.
- X-Frame-Options: DENY (프레임 비허용)
- X-Frame-Options: SAMEORIGIN (동일한 origin만 허용)
- X-Frame-Options: ALLOW FROM uri (지정한 origin만 허용)
역시나 참고 블로그를 통해서 정리하였다. 아래로 학습하자.
참고 블로그
해당 학습내용은 간단히 알아본 것이다. 자세하고 심도깊게 계속 공부하자.
Author And Source
이 문제에 관하여(간단한 HTTP), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@holyja/간단한-HTTP저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)