HTTP(HyperText Transfer Protocol)
모든 컴퓨터 서비스는 인터넷 통신 규약인 프로토콜의 하나를 사용해 통신
W3 상에서 정보를 주고받을 수 있는 프로토콜이다. 주로 HTML 문서를 주고받는 데에 쓰인다. 주로 TCP를 사용하고 HTTP/3 부터는 UDP를 사용하며, 80번 포트를 사용한다 (출처:위키피디아)
W3(world wide web)에서 데이터 통신할때 HTTP 프로토콜이 사용되었으며 보안 기능이 탑재된 HTTPS(HTTP Secure) 프로토콜을 사용하기 시작한다. 하는데 근간이다.
명시된 URL에 데이터를 탐색하는 메서드가 프로토콜에 정의
메시지 포맷
- 클라이언트는 서버로 요청메시지를 전달
- 서버는 클라이언트로 응답메시지를 전달
요청 메시지
- 요청 내용
e.g.) GET /images/logo.gif HTTP/1.1
- 헤더
보기) Accept-Language: en
- 빈 줄 (empty line)
- 기타 메시지를 포함하여 표시된다.
HTTP 메소드
HTTP로 받아온 요청을 어떻게 처리하는 가에 대한 방식들을 제공
HTTP 메소드 | RFC | 요청에 Body가 있음 | 응답에 Body가 있음 | 안전 | 멱등(Idempotent) | 캐시 가능 |
GET | RFC 7231 | 아니요 | 예 | 예 | 예 | 예 |
HEAD | RFC 7231 | 아니요 | 아니요 | 예 | 예 | 예 |
POST | RFC 7231 | 예 | 예 | 아니요 | 아니요 | 예 |
PUT | RFC 7231 | 예 | 예 | 아니요 | 예 | 아니요 |
DELETE | RFC 7231 | 아니요 | 예 | 아니요 | 예 | 아니요 |
CONNECT | RFC 7231 | 예 | 예 | 아니요 | 아니요 | 아니요 |
OPTIONS | RFC 7231 | 선택 사항 | 예 | 예 | 예 | 아니요 |
TRACE | RFC 7231 | 아니요 | 예 | 예 | 예 | 아니요 |
PATCH | RFC 5789 | 예 | 예 | 아니요 | 아니요 | 예 |
응답 메시지
- 상태표시 행(status line): 상태코드(status code)와 reason message를 포함한다. (예. HTTP/1.1 200 OK. 클라이언트의 요청이 성공적으로 전달되었음을 표시)
- 응답 헤더필드 (예.Content-Type: text/html)
- 빈 줄 (empty line)
- 기타 메시지
응답 코드
코드메시지설명
코드 | 메시지 | 설명 |
100번대 | Informational(정보) | 정보 교환 |
200번대 | Success(성공) | 데이터 전송 성공,수락! |
300번대 | Redirection(리다이렉션) | 자료 위치 변경 |
400번대 | 클라이언트 오류 | 주소 오기입, 잘못된 요청 |
500번대 | 서버 오류 | 요청 처리 불가 |
e.g. 404 Page Not Found 문서를 찾을 수 없음. 서버가 요 청한 파일이나 스크립트를 찾지 못함.
HTTP Method
서버에서 요청을 보내 응답을 받기 위해 GET, POST 방식으로 요청
route decorator의 인자로 URL 접근에 대해 몇가지 다른 방식을 제공
기본값으 GET요청에만 응답
@app.route("/",methods =["GET"]) #GET 방식만 사용
@app.route("/",methods =["POST"]) #GET 방식만 사용
@app.route("/",methods =["GET","POST"]) #두 방식 사용
GET 요청 :
url 파라미터
작은 양의 데이터
POST 요청 :
전달하려는 정보가 HTTP body에 포함
많은 양의 데이터
- 플라스크 프레임워크에서 요청에 대한 정보는 request에 담겨있고 객체는 안전을 보장한다.
- 이 request 모듈에는 HTTP 메서드에 대한 정보를 얻을 수 있는 method와 GET 방식으로 URL에 인자를 'key=value' 형태로 전달했을 때 그 인자를 참조할 수 있는 args, POST나 PUT 방식의 HTML 폼 데이터를 얻을 수 있는 form 속성이 있다.
(1) GET
- 브라우저가 어떤 페이지에 저장된 정보를 얻기 위해 모든 데이터를 url로 보내 서버에 요청하고 서버는 그 정보를 보낸다.
- url에 파라미터 값을 넣어 서버에 데이터 전송
- url?키=값
- 2개 이상의 파라미터 작성시 '&'로 연결하여 추가
- url?키1=값1&키2=값2
- 길이제한이 있음
- 보안에 취약
GET 요청으로 들어온 데이터들을 키 값을 가지고 하나씩 볼 수 있음
초기값 지정하지 않으면 기본 null
request.args.get(이름)
request.args.get(이름,초기값)
http://localhost:5000/?name=foo&age=12
각 name, age 키의 값 foo, 12 가져옴
from flask import Flask,jsonify, request
app = Flask(__name__)
@app.route('/',methods=['GET'])
def user():
name=request.args.get('name','이름')
age=request.args.get('age','나이')
return name + " : " +age
(2) POST
브라우저는 서버에게 새로운 정보를 전송하도록 특정 URL에 요청하고 그 정보가 오직 한번 저장되는것을 보장.
보통 HTML body/폼을 통해서 숨겨서 서버에 데이터 전송하는 방식(주로 입력창)
다양한 데이터에 적용 가능
request.form()
form 태그의 action, method가 route와 함수명과 일치해야한다.
input.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>POST method in Flask</title>
</head>
<body>
<form action="/post" method="post">
<p>Name: <input type="text" id="input" name="input" placeholder="Type your name here!"></p>
<p><input type="submit" value="Submit" onclick="alert('Submitted!')" /></p>
</form>
</body>
</html>
app.py
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route("/")
def home():
return render_template('input.html')
@app.route("/post",methods=['POST'])
def post():
val = request.form['input']
return "Welcome %s" %val
if __name__ == "__main__":
app.run()
루트에서 input.html 파일 호출
제출하면 post메소드로 요청이 들어오면서 /post 로 이동, 폼에 입력된 입력값이 출력된다.
해당 주소로 직접 접근하면 요청된 주소에 GET 메소드가 허락되지 않는다라는 에러가 나온다.
(3) GET & POST
각 요청에 따라 페이지 처리 할 수 있도록 조건문 사용
@app.route("/user",methods=['GET', 'POST'])
def post():
if(request.method =='POST'):
...
#elif(request.method == 'GET'):
else:
...
return ...
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# 요청이 GET 이거나, 인증정보가 잘못됐을때 실행.
return render_template('login.html', error=error)
폼 에 접근한 username, password 키가 존재하지 않으면 KeyError가 발생
예외처리를 하지 않는다면 HTTP 400 잘못된 요청(Bad Request)에 대한 오류 페이지를 보임
출처:
https://ko.wikipedia.org/wiki/HTTP
https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html#id16
'CS > Web' 카테고리의 다른 글
사용자 에이전트(User Agent) 개요 및 구조 해석(브라우저,OS,기기) (0) | 2023.02.06 |
---|---|
[BE-Django] model (0) | 2021.12.06 |
[BE-Flask] 3. 플라스크 템플릿 (0) | 2021.11.08 |
[BE-Flask] JWT(Json Web Token) (0) | 2021.11.05 |
[BE - Flask] 2. 라우팅(Routing) (0) | 2021.11.04 |