CPP로 웹서버만들기 - 1

JaeGu Jeong·2022년 11월 13일
0

RFC7230을 기준으로 작성되었습니다.

start-line(시작줄)부분

method 토큰을 시작으로, 공백 (SP), request-target, 공백 (SP), 프로토콜 버전, 그리고 CRLF를 끝으로 한다.
시작줄 정보가 유효하지 않으면 400또는 301(리다이렉트)상태코드로 응답한다.
또한 서버는 리다이렉트없이 request데이터를 수정해서 처리하면 안된다.
만약 서버가 처리 할 수 있는 시작줄의 길이를 초과하면 501에러 처리해야한다.

헤더부분

start-line(시작줄)이후 헤더필드가 CRLF기준으로 나누어져있다. 만약 시작줄과 헤더 블록이 분리(공백삽입 또는 CRLF두번 이상 삽입)되어 있다면 클라이언트의 request를 무시해야 된다.
클라이언트는 Host헤더를 무조건 보내야하며, 시작줄바로 다음에 위치 할 것을 권장한다. 헤더와 콜론사이에 공백이 있어서는 안된다. 헤더의순서는 큰 영향이 없다. 쿠키헤더만 예외적으로 파싱해야 하는 부분이 있다.

body부분

conf파일에서 지정한 client_max_bodysize를 초과하는 request가 들어오면 413에러페이지를 응답한다.

클라이언트의 행동

클라이언트는 서버에 연결시도시 절대 자동재시도를 하면 안된다.

서버의 행동

응답을 보내고 바로 소켓을 close하면 안된다. 클라이언트는 응답을 수신하지 못하는 상황이 발생 할 수 있다. 일반적으로 서버는 클라이언트와의 읽기/쓰기 연결에서 쓰기만 닫고, 클라이언트에서 close를 송신하면 서버에서 끝까지 패킷을 읽다가 완전히 종료한다. 서비스거부공격이나 응답분할공격이 의심되면 요청을 차단 할 수도있다.

http의 오해

웹브라우저와 서버간의 통신만을 위한 프로토콜이 아니다. 사물통신(IOT)와의 통신에도 사용 될 수 있으므로 웹브라우저에 국한되서 작동한다고 생각하는 것은 잘못된 것이다.

응답분할 공격 예방법

인코딩된 CR 및 LF (%0D %0A)데이터에 대한 요청을 필터링.

http 로그데이터 취급

본질적으로 기밀이며, 취급은 각 국가의 법고하 규정에 의해 제한될 수 있다. http에서는 재식별을 막는 방법이 역부족하므로 클라이언트에서 로그데이터에 접속하는 키가 가명일지라도 안전하지 않다.

profile
BackEnd Developer

0개의 댓글