728x90
반응형
HTTP Protocol

HTTP(HyperText Transfer Protocol)

W3 상에서 정보를 주고 받을 수 있는 프로토콜

주로 HTML 문서를 주고 받는데 사용됨.

주로 TCP를 사용하고, HTTP/3 부터는 UDP를 사용하며 80번 포트를 사용한다.

 

HTTP 는 0.9 버전부터 사용되었다.

0.9 버전은 서버로부터의 단순 읽기 기능만 지원하고 기본 연결은 다음과 같다.

HTTP 0.9 버전의 연결

먼저 클라이언트가 웹 브라우저를 이용하여 서버에 연결을 요청하면, 연결 요청을 받은 서버는 그 클라이언트에 대해 서비스를 준비한다

서버가 준비상태가 되면 클라이언트는 읽고자하는 문서를 서버에 요청한다.

그러면 서버는 웹 문서 중 클라이언트가 요청한 문서를 클라이언트에 전송하고 연결을 끊는다.

위 그림의 기본 연결 기능은 HTTP 버전에 관계없이 동일 하다.

 

하지만 HTTP 0.9는 하나의 웹 페이지 안에서도 텍스트와 그림마다 Connect 과정을 반복해서 거쳐야 했기 때문에

무척 비효율적이었고 따라서 오래 사용하지 못하였다.

 

하지만 1.0 버전부터는 한번의 Connect 후에 Request 와 Response를 반복 할 수 있게 되었다.

현재 인터넷에서 사용되는 대부분의 HTTP가 이런 방식의 1.0과 1.1 버전이다.

 

HTTP Request


HTTP Request는 웹 서버에 데이터를 요청하거나 전송할 때 보내는 패킷으로, 주로 GET, POST와 같은 메소드를 사용한다.

 

- GET 방식:

GET 방식은 가장 일반적인 HTTP Request 형태로 웹 브라우저에 다음과 같은 요청 데이터에 대한 인수를

URL(Uniform Resource Locator)을 통해 전송한다.

 

www.wishfree.or.kr/list.php?page=1&search=test 

 

GET 방식에서는 각 이름과 값을 & 로 결합하며 글자 수를 255자로 제한한다.

메신저로 알려준 URL을 클릭하여 특정 웹 페이지를 똑같이 확인할 수 있는 경우가 GET 방식이 사용된 예이다.

GET 방식은 데잍터가 주소 입력란에 표시되기 때문에, 최소한의 보안도 유지되지 않는, 보안에 매우 취약한 방식이다.

따라서 간혹 아이디나 패스워드가 인수로 저장되어 전달되는 경우도 발생한다.

 

- POST 방식:

POST 방식은 URL에 요청 데이터를 기록하지 않고, HTTP 헤더에 데이터를 전송하기 때문에 GET방식에서의 URL의 형태가

존재하지 않는다. POST 방식은 내부의 구분자가 각 파라미터(이름과 값)를 구분하며, 서버가 각 구분자에 대한 내용을 해석하여

데이터를 처리하기 때문에 GET 방식에 비해 상대적으로 처리 속도가 늦다.

POST 방식에서는 인수 값을 URL 을 통해 전송하지 않기 때문에 다른 이가 링크를 통해 해당 페이지를 볼 수 없다.

 

그 밖의 기타 방식이 존재.//

 

HTTP Response

HTTP Response는 클라이언트의 HTTP Request에 대한 응답 패킷이다.

서버에서 쓰이고 있는 프로토콜 버전, Request 에 대한 실행 결과 코드 및 간략한 실행 결과 설명문(OK 문) 에 대한 내용이 담겨 있다.

 

전달할 데이터의 형식과 데이터 길이 등과 같은 추가 정보가 MIME 형식으로 표현되어 있는데,

헤더 정보 뒤에는 실제 데이터(HTML이나 그림 파일)가 전달되며 데이터 전달이 끝나면 서버는 연결을 끊는다

 

정보전송, 성공, 리다이렉션, 클라이언트측 에러, 서버측 에러

 

---

 

특징:

 

- HTTP 기본적으로 요청/응답 구조

클라이언트가 HTTP Request 서버에 보내면 서버는 HTTP Response로 응답

모든 통신이 요청과 응답으로 이루어짐

 

- HTTP Stateless (무삭제)

Stateless란 말 그대로 state(상태)를 저장하지 않음

각각의 요청/응답은 독립적인 요청/응답이며 이전에 보낸 요청/응답을 저장하지 않음

여러 요청과 응답의 저장이 필요할 때 쿠키나 세션 등등을 사용(쿠키는 유저, 세션은 서버에서 저장)

 

- HTTP Method 를 통해 통신을 구분

GET, POST, PUT, DELETE 등등(웹페이지는 GET, POST로 충분)

RESTful(REST API) 사용시 Method와 명시한 자원 간에 처리를 일대일 적용 가능

REST(Representational State Transfer)

HTTP Method(Post, GET, PUT, DELETE) < - > CRUD(CREATE, READ, UPDATE, DELETE)

 

구조:

HTTP Request

 

- Start-line :

3부분으로 구성 (ex: GET / path HTTP / 1.1)

HTTP Method, Request target, HTTP Version

- Header:

해당 요청에 대한 추가 정보를 명시

Key:Value로 구성되어 있고 양식도 마찬가지

- Body:

요청의 실제 메시지, 내용

필수로 포함해야 하는 부분은 아님

 

HTTP Response

 

- Status-line :

응답 상태를 간략히 표시. 3부분으로 구성

HTTP Version, Status code, Status Text (ex: HTTP/1.1 200 OK)

 

- Header :

요청과 동일

응답에서만 사용되는 값이 존재 (ex: User-Agent 대신 Server)

 

- Body :

응답의 실제 메시지, 내용

필수로 포함해야하는 부분은 아님

주로 HTML, JSON, XML 과 같은 내용이 포함

 


import requests

# url = 'https://pokeapi.co/api/v2/pokemon?limit=50&offset=50'
# res = requests.get(url)
# # requests.post()
# # print('res : ', res.text)
# # print('res : ', res.content)

# # dict 

# responseData = res.json()
# print('keys: ', responseData.keys()) # loot keys

# results = responseData['results']
# # print('results :', results)

# for result in results:
#     print(result)

# abilities = responseData['abilities']
# print('abilities: ', abilities)

# print('res : ', res.json()) #json
# print('res : ', type(res.json())) # res :  <class 'dict'>

limit = 50
api = 'https://pokeapi.co/api/v2/pokemon'

while True:
    inputText = input('page number: ')
    
    if not inputText.isdigit():
        continue

    page = int(inputText)

    if page <= 0:
        continue
    
    url = f'{api}?limit={limit}&offset={limit * (page - 1)}'
    
    res = requests.get(url)
    responseData = res.json()
    
    results = responseData['results']
    
    for result in results:
        print(result)

서버구축..

loot -> workspaces -> nodejs -> server_basic + server.js

linux 기준.

 

1. nodejs 설치.

$ sudo apt install nodejs

2. 아래 코드 입력

소스코드 설명

웹서버를 실행하기 위해서 http 모듈을 require로 불러옴

require는 다른 언어의 import와 유사한 기능

 

node.js는 require 후에 해당 모듈을 http라는 변수에 담은 후 하나의 독립적인 객체로 사용함.

http 모듈에 정의된 모든 기능이 변수 http로 생성되는데 변수명은 꼭 http로 하지 않아도 됨

var http = require('http');

 

http 모듈에 정의되어 있는 createServer 함수로 서버를 생성함

일반적인 함수사용은 다음과 같다.

 

function nameOfFunction(parameters)
{
	// excute logic..
}

createServer()에 parameter로 입력되는 function(request, response){} 은 함수명이 없음.

함수명이 없이 function 이라고만 작성된 parameter는 event 발생시 callback 됨.

즉, 생성된 서버로 어떤 요청이 들어오면 function 내부의 로직이 실행되면서

function 내부에 선언한 request와 response라는 이름으로 사용할 수 있는 값을 넘겨줌

그래서 function 블럭 {} 내부에서는 request와 response 로 넘어오는 어떤 값을 사용할 수 있게 됨

 

var server = http.createServer(function(request, response)
{
	response.writeHead(200, {'Content-Type' : 'text/html'});
    response.end('Hello World');
});

function 내부 로직을 살펴보면 response로 넘어온 값으로 함수 실행.

즉 callback 되었을 때 response에 담겨져 오는 값은 require로 가져온 http 모듈 처럼 내부적으로 함수를

가지고 있는 객체라는 의미가 됨

 

여기서 response 객체는 서버로 웹브라우저나 또는 앱으로부터 어떤 요청이 있을 때 요청한 사용자 측으로

값을 반환해 줄 때 사용하는 객체임

 

 

 

3. node server 실행

 

4. 웹브라우저를 통해 아래 로컬 호스트에 접속

 

http://localhost:8080

 

5. 서버접속 확인

 

728x90
반응형

'Network' 카테고리의 다른 글

File Transfer Protocol (FTP)  (0) 2022.12.04
TCP / IP (Socket programming)  (0) 2022.12.01
Protocol  (0) 2022.12.01
Serial Communication  (0) 2022.12.01
UART Communication  (0) 2022.11.30

+ Recent posts