HTTP의 기초 - 4



전에 다루었던 HTTP의 특성중에 로그인은 어떤 상태인지 알아보자

앞서 HTTP는 stateless 상태, 서버에 상태를 저장할수 없다고 했었다.

그렇기 때문에 사용자 구분을 위해서 쿠키를 사용한다.


사용자 식별에는 다음과 같은 방법이 있다.

1) IP 추적

2) HTTP Authentication

3) URL에 식별자 포함

4) Cookie


이 중에서 쿠키를 제일 많이 사용한다.





쿠키는 서버에서 먼저 요청한다.

브라우저가 서버에 데이터를 요청을 했을때 서버에서 사용자 확인이 필요하다면 

Set-Cookie라는 명령에 세션 아이디를 실어 보낸다.

그러면 클라이언트는 이 세션 아이디를 받아 쿠키 값을 생성한다.

그리고 다음부터 서버에 쿠키 데이터와 함께 요청을 전송 해준다.


세션은 상당히 긴 숫자로 되어있는데 이유는 세션이 해킹 당하게되면

다른 사용자가 자신의 권한으로 서버에 요청을 보낼수 있기 때문이다.


쿠키의 용도는 다음과 같다.

1) 세션관리

2) 개인화(예: 장바구니)

3) 트래킹(사용자 정보 추적)





이렇게 만들어진 쿠키값을 가지고 세션을 관리할수 있게된다.

그럼 세션이 어떻게 생성되고 관리되는지 알아보자


클라이언트가 로그인을 POST로 보내게 되면

먼저 세션 아이디를 하나 생성하고 쿠키값에 세션 아이디를 돌려준다.

서버의 데이터 베이스에도 세션의 정보와 유저의 정보를 저장한다.


서버가 Set-Cookie라는 명령어를 통해서 해당 정보를 세팅한다

이 명령을 이용해서 클라이언트에게 세션 아이디를 넘기면 

클라이언트는 쿠키에 이 정보를 저장한다.


HTTP는 stateless 이기 때문에 클라이언트로 정보를 넘겨준 후

연결이 끊어지게 된다.


클라이언트 request 요청이 서버로 전달될때 쿠키값에 세션아이디가 전달된다.

서버는 세션 아이디와 매칭되는 유저가 있는지 데이터베이스를 조회하게된다.

데이터베이스에 유저가 있을 때 서버는 세션이 만료되어있지 않은지 다시 검사한 후

response를 클라이언트에게 보내주게 된다.


결론적으로 다음과 같은 세션 처리의 과정들이 일어나는 이유는

HTTP가 stateless, 상태를 저장하지 못하기 때문에 발생하는 일이다.

신고

'프로그래밍 > 네트워크' 카테고리의 다른 글

[네트워크] HTTP의 기초 - 4  (0) 2017.04.18
[네트워크] HTTP의 기초 - 3  (0) 2017.04.18
[네트워크] HTTP의 기초 - 2  (0) 2017.04.18
[네트워크] HTTP의 기초 - 1  (0) 2017.04.18

 HTTP의 기초 - 3



HTTP의 기초 중 포맷에 대해서 알아보자

우리가 response를 보낼 때 content-type이라는 것이 있었는데

어떤 타입으로 응답할 지를 정하는것이다.

이를 MIME(Multipurpose Internal Mail Extensions)이라고 부른다


여기서 MIME은 email 서비스를 위한것이다

email은 흔히 사용하는 네이버나 gmail과 같은 웹메일이 아니다


예전에 email이라는 인터넷 서비스가 있었는데,

이를 위한 표준이었다.






content-type은 다음과 같이 분류되어질 수 있다.

중요한것 중에 multipart/form-data 가 있다.

대용량의 파일을 전송할때 사용하는데, 이미지등을 업로드할 때 form-data를

사용해야지 오류가 나지 않는다.







인터넷 통신의 경우 4개의 layer로 구분한다.


첫번째는 어플리케이션 계층(HTTP)

두번째는 트랜스 포트 계층(TCP)

세번째는 인터넷 계층(IP)

네번째는 네트워크 계층(하드웨어)이다


아래쪽으로 갈수록 물리적인 계층이며 위쪽으로 갈수록 논리적인 계층이다.

HTTP는 TCP를 이용해서 통신을 하게 된다.


TCP는 신뢰성이 있는 통신이다. 

신뢰성을 보장하기 위해서 3-way-handshake라는 것을 하는데

한쪽은 데이터를 보내고, 한쪽은 받을 때

데이터가 제대로 도착했는지 세 방향으로 확인을 하기때문에 그렇게 이름 붙여졌다.


1) sender에서 SYN이라는 무작위 숫자를 넣어서 보낸다.

2) receiver에서 여기에 1을 더한 숫자와 무작위 숫자를 보낸다.

3) sender는 receiver에서 1을 더한 숫자가 도착한 걸 확인한 후에

receiver가 보낸 난수에 1을 더해서 다시 보낸다.


이 과정이 끝난 후 HTTP데이터를 보낸다.

그러나 HTTP의 특성상 데이터를 보내고 나면 연결을 끊어버리므로

데이터를 보낼 때마다 이 과정을 반복해야한다.

따라서 신뢰성 검증에는 좋지만 상당히 오버헤드가 크다.

HTTP 2.0부터는 이와같은 것들이 많이 개선되었다.


중요한것은

TCP는 네트워크를 구성하기 위해서 3-way-handshake를 한다

라는 것을 기억하기 바란다.





HTTP 메소드에 대해서 알아보자

HTTP request 시에 가장 앞쪽 라인에 메소드(요청 방식)이 들어간다.

종류는 8개 이며 주로 사용하는 것은 GET과 POST이다.


GET은 주로 가져올때나 서버의 데이터 변경이 일어나지 않을 때 

POST는 서버의 데이터 변경이 일어날 때


예를 들어, 주소창 검색은 GET,

로그인은 POST가 일반적이다.


GET을 사용하면 url뒤에 쿼리 스트링으로 정보를 전달한다.

POST는 request body에 숨겨져서 보내지게된다.


맨처음에 살펴본 대용량 파일을 전송하기 위한 

content-type의 form도 POST방식이다.







위의 표는 HTTP 응답 코드이다

신고

'프로그래밍 > 네트워크' 카테고리의 다른 글

[네트워크] HTTP의 기초 - 4  (0) 2017.04.18
[네트워크] HTTP의 기초 - 3  (0) 2017.04.18
[네트워크] HTTP의 기초 - 2  (0) 2017.04.18
[네트워크] HTTP의 기초 - 1  (0) 2017.04.18

HTTP의 기초 -2 







 HTTP의 동작 방식에 대해서 알아보자


사용자가 URL을 입력하면 브라우저가 HTTP request로 서버로 보낸다

이 서버는 request를 분석하여 클라이언트가 원하는 HTTP response를 보내게 된다.

이렇게 response를 받은 클라이언트는 이를 바탕으로 원하는 결과물을 출력한다.

(물론 HTTP request와 response에 포멧이 정해져 있다.)


추가로, 실제로는 URL을 가지고 DNS가 어떤 서버로 보낼지 변환을 한다.

사람은 URL을 인식하는데 서버는 이를 IP로 인식하기 때문에 

서버까지 URL을 전달하는데 DNS가 개입하게 된다.




HTTP Request



HTTP request 메세지는 다음과 같이 생겼다.

Request line과 Request Header를 합쳐서 Request Message Header가 된다.

request는 크게 header와 body 2부분으로 나누어 보는데,

때문에 보통 앞쪽을 Message Header, 뒤쪽을 Message Body라고 한다.


Request line의 맨 첫번째는 요청의 종류가 나온다.

GET이나 POST 요청이 대부분이다.

다음은 주소와 프로토콜이 나온다.


request header에서는 Host의 이름이 첫번째 줄에 나오는데

Request line을 포함해 Host까지는 HTTP의 필수적인 요소이다.


나머지는 옵셔널 한 값들이며

어떤 것들을 받을수 있는지, 브라우저의 종류, 바디의 길이 등의 

메타데이터들이 입력된다.


body에는 이미지 업로드나 검색한것들,

서버에 전달해줘야하는 메세지들이 들어가게 된다.





우리가 앞서 만들었던 서버에 index.html을 호출하고,

개발자 도구로 네트워크 탭을 열었을때 Request Header를 확인할 수 있다.




HTTP Response



response의 구조는 request와 비슷하다.

여러가지의 메타 데이터들이 헤더에 위치하며

바디는 데이터 본문이 보내진다.






서버로 부터 응답을 받은 브라우저는 다음과 같이 동작한다.

1) 최초에는 HTML을 가져온다

2) HTML에 css, js, 이미지에 대한 링크 정보 추출

3) 추출한 정보의 URL을 이용해서 새로운 요청을 보낸다

4) 모든 웹 자원을 받아와서 랜더링을 시작한다.

5) 1.1 은 파이프라인 2.0 은 병렬 처리로 성능 개선







다음은 URL(Uniform Resource Locator)의 구조이다.

URI는 URL과 URN을 합친것을 말한다.

URL 을 가지고 서버의 리소스를 식별할 수있다.


스킴 :사용자이름:비번@호스트:포트/경로;파라미터?쿼리#프레그먼트


사용자 이름과 비밀번호는 옵셔널한 값이라 잘 사용하지 않는다.

포트를 생략할 경우 http는 80이 기본포트이고 

https는 443번이 기본포트이다.


쿼리는 편의상 =과 &를 사용한다

예를들어, key=value&key=value 식으로 사용한다.

신고

'프로그래밍 > 네트워크' 카테고리의 다른 글

[네트워크] HTTP의 기초 - 4  (0) 2017.04.18
[네트워크] HTTP의 기초 - 3  (0) 2017.04.18
[네트워크] HTTP의 기초 - 2  (0) 2017.04.18
[네트워크] HTTP의 기초 - 1  (0) 2017.04.18

HTTP의 기초 - 1  






웹은 월드 와이드 웹(WWW), 줄여서 WWW로 표시한다


인터넷과 웹은 다른것이다.

인터넷은 미국 국방성에 의해서 개발된 ARPANET이 전신이며,

웹은 팀 버너스리에 의해서 개발 되었다.


웹의 탄생 배경은 팀 버너스리가 다니던 

회사 내부 여러 컴퓨터의 문서 교환이 불편한 관계로 효율적인 방법을 찾다가

공통의 망으로 연결하여 데이터의 교환이 이루어지게 한것이 시초이다.


웹의 3요소는 HTTP, HTML, URL이다

프로토콜은 HTTP,

전송하는 문서는 HTML,

전송하는 문서의 고유한 주소는 URL이다.








여기서 HTTP란 HyperText Transfer Protocol

웹에서 텍스트와 이미지들을 전송하는 통신 규약을 타내낸다.

HTTP를 이용해서 WWW상에서 데이터를 주고받을수 있으며

주로 HTML이나 이미지, 비디오등 전송하는데 쓰인다.


TCP와 UDP를 사용하며 80번 포트를 사용한다.








웹 클라이언트와 서버의 개념이 있는데

서버는 서비스를 제공하는쪽, 클라이언트는 서비스를 요청하는 쪽이다.

클라이언트는 웹브라우저를 가지고 서버로 URL을 요청한다.


정확하게는 HTTP request로 요청한다.

서버는 이 요청을 받아서 어떤 자료를 보내줄지 결정하게 된다.

자료를 보내줄 때 HTTP response로 응답하게 된다.


클라이언트는 주로 웹브라우저인데 꼭 웹브러우저일 필요는 없다.

예를 들어 모바일이나 여러 터미널 프로그램 같은 경우도 클라이언트 일수 있다.


서버는 클라이언트에서 요청한 문서를 제공해준다.

클라이언트와 서버 사이에 프록시라는 것이 위치할 수있다.

(프락치와 비슷한 느낌이다 - 사이에 있다는 뜻)

프록시는 캐시 필터링, 로드밸런싱, 인증, 로깅 등의 다른 일을 처리해줄 수있다.







HTTP의 특징은 간단하다는 것이다.

또한 확장이 가능하며 상태가 없다는 것(stateless)이다.

 상태가 없다는것은 서버에서 클라이언트의 정보를 저장 할수 있는 수단이 없다는것이다.


로그인도 하고 장바구니에 아이템도 담을수있는데 왜 정보를 저장 할수 없는 걸까

그것은 HTTP가 아닌 쿠키를 이용해서 하는 것이기 때문이다.


HTTP는 HTTP/1, HTTP/1.1,  HTTP/2로 발전되었다.

아직까지는 1.1을 많이 사용하고 있다




1
2
3
4
5
echo "<h1>hello<h1>" > index.html
#python 2
python -m SimpleHTTPServer 8000                                                                          
#python 3
python -m http.Server 8000
cs


간단한 실습을 통해 HTTP 서버를 만들어보자

mac 기준으로 터미널에 다음과 같은 명령어를 입력한다.

python 버전에 맞추어 서버를 열어주자






서버가 열릴경우 다음과 같이 잘 열렸다는 로그가 출력된다.

Control + C 로 서버를 빠져 나올 수 있다.






8000번 포트로 접근해서 해당 파일에 대한 request를 주면

서버에서 파일에 대한 response로 HTML파일을 출력할 수 있다.






1
2
3
$ telnet localhost 8000                                                                                     
$ GET / HTTP/1.0
$ Host:localhost
cs

 

다음은 텔넷에 연결해보도록하자

터미널 창에 다음과 같은 명령어를 입력해서 텔넷에 접속 후, 

서버로 request 요청을 보낸다.





위와 같이 초기에 저장해둔 index.html의 결과값이 잘 출력된다.

서버에서 response가 도착한것이다.

HTTP/1.0 200은 정상이라는 뜻이다.

신고

'프로그래밍 > 네트워크' 카테고리의 다른 글

[네트워크] HTTP의 기초 - 4  (0) 2017.04.18
[네트워크] HTTP의 기초 - 3  (0) 2017.04.18
[네트워크] HTTP의 기초 - 2  (0) 2017.04.18
[네트워크] HTTP의 기초 - 1  (0) 2017.04.18

+ Recent posts

티스토리 툴바