HTTP(hypertext transfer protocol)
:서버와 클라이언트가 주로 html문서를 주고받는데에 사용하는 프로토콜.
:서버와 클라이언트의 통신을 위한 규약.
UNIX의 기본 프로토콜로 사용되었고, 현재는 인터넷 범용 프로토콜로 사용되고있다..
주로 tcp/udp 80번 포트를 사용.
ex) https://www.codestates.com:8080
👆(포트번호는 생략될수있기에, 주소창에서는 안보일수있다.)
SEE ALSO : "tcp, udp, well-known port"
MUST READ : "RFC 2616 - HypetText Transfer Protocol -- HTTP/1.1"
http/1.1의 경우 요청,응답은 start/status line, header 그리고 body로 이뤄짐.
MUST READ : "https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages"
///////////////////////////////////////////////////////////
2). connectionless(비연결성)
: 한번의요청엔 한번의응답을! 응답이후에는 연결끊김.
http의 각 요청은 모두 '독립'적이다.
///////////////////////////////////////////////////////////
🤔AN EXAMPLES OF THE HTTP REQUEST/RESPONSE MESSAGE
👉HTTP REQUEST
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ex)
요청 uri 프로토콜/버전
GET /docs/index.html(요청한 html데이터) HTTP/1.1 | HEADER(REQUEST LINE)
Host: www.codestates.com | OPTIONAL REQUEST HEADERS
Accept: image/gif, image/jpes, / |
Accept-Language: en-us |
Accept-Encoding: gzip, deflate |
User-Agent: Mozila/4.0 (Compatible; MSIE 6.0;..) |
--blank area--
request payload | BODY(OPTIONAL)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
👉HTTP RESPONSE
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ex)
프로토콜/버전 상태코드 상태응답
HTTP/1.1 200 ok (상태코드 & reason phrases) | HEADER(STATUS LINE)
Date: Sun, 18 Oct 2009 08:56:53 GMT | OPTIONAL RESPONSE HEADERS
Server: Apache/2.2.14 (Win32) |
Last-Modified: Sat .... |
Content-Length: 44 |
Content-Type: text/html |
.
.
--blank area--
CORS(Cross-Origin resource sharing) > 블로그보고 다시 정리
: 도메인 또는 포트가 다른 서버의 자원을 요청하는 메커니즘.
다른출처에서들어오는요청을 막거나 풀어준다. 즉, 크로스오리진의 요청을 듣거나 막아줄수있다.
즉, 신뢰할 수 있는 클라이언트에만 응답하려고
*이때 요청을 할 때에는 cross-origin HTTP에 의해 요청된다.
심플 리퀘스트시 json을 주고받을때 허용여부를 응답으로 받음..
cors는 서버단에서 설정하는것임 < 0204_ 이를 내일(0205) 스프린트에 사용하므로 미리 알아봐야함.
프로토콜,도메인,포트 중에 하나라도 허용된것이 아니면 크로스오리진이라 할수없음.
*cross origin을 결정하는 기준은 프로토콜의 차이!!
ex) http://domain-a.com으로부터 전송되는 html페이지가,
src속성을 통해 XMLHttpRequest를 사용하여,
http://domain-a.com/image.jpg를 요청하는경우가 있다.
오늘날 많은 웹페이지들은, css 스타일시트,이미지 그리고 스크립트와 같은 리소스들을
각각의 출처로부터 읽어오며 이를 cross-origin request라고 한다.
하지만 동일 출처 정책(same-origin policy)때문에 cors같은 상황이발생시
외부서버에 요청한 데이터를 브라우저에서 보안목적으로 차단한다.
*동일출처정책: 불러온 문서나 스크립트가, 다른 출처에서 가져온 리소스와 상호작용하는 것을 제한하는 중요한 보안방식임. 이것은 잠재적 악성문서를 격리한다.
...그로인해 정상적으로 데이터를 받을수없게 된다.
XMLHttpRequest, fetch API는 이 동일출처정책을 따르며,
이 api들을 사용하는 웹애플리케이션은 자신의 출처와 동일한 리소스만 불러올수있으며,
다른 출처의 리소스들을 불러오려면
그 출처에서 올바른 cors헤더를 포함한 응답을 response해야한다.
EXAMPLES OF ACCESS CONTROL SCENARIOS
'GET','POST','HEAD'메소드 중 하나만을 사용하여 요청해야함.
header에 별도의 속성 추가를 하면 안되고,
mdn에 기술된 기본 header만 option으로 들어가야함.
cors header를 사용하여 서버와 클라이언트간의 데이터교환을 나타낸것.
----------------------------------------------------------------
클라이언트 -----------------------------> 서버
(Simple request)
GET /doc HTTP/1.1
Origin: Server-b.com
<-----------------------------
HTTP/1.1 200 ok
Access-Control-Allow-Origin: *(실제론 * 쓰면 다 허용해버리니 안됨..)
xhr.send()
js code ------------------> browser -------------------------------> server
preflight req(if nessasary)
-------------------------------->
서버의 요청수정을 위해서는 그 요청이 안전한지 확인하는것.
: 'PUT','DELETE','CONNECT','OPTIONS','TRACE','PATCH'메소드 중 하나만을 사용하여 요청.
실질적인 요청 전에 option메소드를 통해
먼저 메시지가 간것이, 네트워크탭에 보일것이다.
이게 바로 프리플라이트 리퀘스트가 된것이다!!!!
그럼으로, 실제 요청이 안전한지 서버가 미리 파악할수있도록 하는 수단이다.
그리고 모든 cross origin요청이 이걸 발생시키는것이 아니다.
심플 리퀘스트를 실행하지못하면 프리플라이트가 실행된다.
즉, 심플 리퀘스트 실행 시, 프리플라이트를 실행하지 못한다.
mdn에 기술된 특정 세개의 header속성이 아닌 다른 속성을 만약에 상요한다면
이 프리플라이트 리퀘스트가 실행된다고 함.
----------------------------------------------------------------
클라이언트 -----------------------------> 서버
(Simple request)
GET /doc HTTP/1.1
Origin: Server-b.com
<-----------------------------
HTTP/1.1 200 ok
Access-Control-Allow-Origin: *
🤔만약 어떤 페이지의 url을 주소창에 쳐서 불러온다면..
코드스테이츠만 해도 개발자도구를 킨 상태로 '네트워크탭'을 보면 수많은 get요청된 자원들이
response로 잘 들어있는것을 볼수있다.
*참고로 어떤 페이지의 url을 주소창에 쳐서 불러오는 행위는 모두 get요청임
그 중, 제일 상단에 있는 최초로 http요청을 한 내역을 볼수있는데, 클릭해서 내용들을 확인해보면
💓 General(
ex) Request URL : https://codestates.com/ | Request Method: GET | status code: 304
| remote address : 13.35 .. | policy : no-referrer- ...)
과,
💓 request header(
ex) authority: codestates.com | method: GET | path: / | scheme : https
| accept : text/html, application/xhtml+xml, application/xml;q=0 ..
| Accept-Language: en-us | Accept-Encoding: gzip, deflate : Cookie: ass group id=...)
👆만약 정식으로 도메인을 사서 생성된 url이 아닌, '개발자 임의로 만든 url'이면,
저자, 메소드, 경로, 스킴 은 안나오고 GET url, host, connection 필드가 나오는듯...
👆 만약 페이로드를 주는 요청이라면 주소검색도 해당하는진 모르지만 채터박스의 경우
리퀘스트 페이로드에서 보낸 유저네임,텍스트,룸네임 확인도 가능하단 사실 ㅇㅇ
와,
잘 응답이 되었으므로
💓 response header(
ex) age: 76486 | date: Tue, 02 Oct 2018 GMT | server: AmazonS3 | status:304
| via: 1.1 blabla... )까지 확인해볼수있다.
👆만약 정식으로 도메인을 사서 생성된 url이 아닌, '개발자 임의로 만든 url'이면,
age, date, status, via는 안나오고, HTTP 1.1 304,accept-ranges:bytes, 캐쉬컨트롤?
❗IF!!!! 잘못된 요청이 간다면 네트웤탭에서는??!!❗
만약 codestates.com/saffsfs 뭐 일케 이상한 라우팅을 시키면
하고 네트워크탭 들가보면 404 스테이터스 요청 내역이 생긴게 보일거임 ㅇㅇ
400번대 에러: 클라이언트 에러.
👆 참고:우리는 공부중에 아마 400 bad request(= 잘못된 요청)에러를 현재 많이 볼수있을거라 함!!
500번대 에러: 서버 에러 -> 서버 터진거임
//////////////////////////////////////////////////////////////////////////
👆참고: 네트워크탭의 전송내역은, 웹서버에서 클라이언트가 제공될때!! 사용이 가능하다 당연히.
즉, file:// (x), http:// (o) 인 경우 http 패킷확인이 가능한것이다 언더스탠?
❓먼저 검색창에 url을 입력후 엔터를 치면? : 실제로는 많은일이 그안에서 벌어지고있다.❓
프로토콜/ host / path
ex) http://www.google.com/int1/ko_kr/about/
//////////////////////////////////////////////////////////////////////////
STEP ONE: 도메인 이름 탐색
www.google.com
의 ip가 뭔지 요청.위의
www.google.com
부분이 실제로 어떤 ip를 갖고있는지, dns서버(도메인서버)에 물어본다.
👆참고: 응답으로 온 global ip주소를 주소창에 그대로 치면, 그 사이트(ex) google)가 그대로 나옴.
😥 *if step 1 fails...
→ 만약 유효하지않은 ip주소라면 err_name_not_resolved 이런 에러뜨면서 안나올꺼임
//////////////////////////////////////////////////////////////////////////
STEP TWO: 웹 서버(http)요청
URI(uniform resource indentifier)
: 파일을 요청하는것 뿐만 아니라, 비즈니스로직 처리도 요즘은 해서, url을 이렇게? 요즘은 부른다.
😋레퍼런스😋
👊❗❓ 네트워크 탭도 경로가 있음 ㄷㄷ
chrome devtool: network tab
-> https://developer.google.com/web/tools/chrome-devtools/network-performance/reference
(구글의 개발자도구-네트웤탭 경로)
👊
주로 tcp/udp 80번 포트를 사용.
ex) https://www.codestates.com:8080(포트번호는 생략될수있기에, 주소창에서는 안보일수있다.)
SEE ALSO : "tcp, udp, well-known port"
MUST READ : "RFC 2616 - HypetText Transfer Protocol -- HTTP/1.1"
👊
http/1.1의 경우 요청,응답은 start/status line, header 그리고 body로 이뤄짐.
MUST READ : "https://developer.mozilla.org/en-US/docs/Web/HTTP/Messages"
0205 socrative
*unexpected token h in json at position 0
json을 읽어오지 못할때, 즉 json을 파싱하지 못할때의 에러.