-
Notifications
You must be signed in to change notification settings - Fork 1
회의록 | 4주차
jeongmin edited this page Feb 2, 2024
·
1 revision
기간: 24.01.22 ~ 24.01.28
이 전에 root와 index를 활용하여 최종 uri를 확정한다.
- index 파일을 디렉토리에 붙였을 때 있는 경우 붙여야 함 두둥
- / (루트)를 제외하고 디렉토리 경로(/로 끝나는 uri)인 경우 DirectoryBuilder로 분기
- 로케이션 블록에서 지원하는 cgi extension이 포함된 파일인 경우 CGI Builder로 분기
- 이 외의 경우 Static(GET / HEAD) Builder로 분기
- 중간에 리다이렉션 있으면 Builder Generator로 변경
- 1, 2, 3에서 예외 발생 시 Builder를 Error Builder로 변경
- 현재 구현된 상태는 root 디렉토리에 / 가 붙어있다고 가정되어있기 때문에 config 블럭 파싱 구현 시 /가 없다면 추가해주어야 함
- fullPath를 만드는 부분이 build 함수 내부에서 구현되었는데, 추후 반복적으로 쓰일 것 같아 파싱 끝나고 한번 생성하는 부분으로 함수화
- 파일에 대한 존재 여부, 권한 여부 또한 반복적으로 사용될 것 같아 Util에 함수화 필요
[ selectResponseBuilder 함수 구현]
- 이 전에 허용되지 않는 메서드인 경우 405 예외 발생
- path가 예쁘게 만들어졌다고 가정
- return이 location 블록에 존재할 경우 해당 경로로 redirection
- 디렉토리 경로인 경우
- index 파일을 붙이고 파일이 존재하면 4번으로 이동
- 파일이 존재하지 않으면 autoindex build
- uri에 해당하는 파일이 없으면 404 날려
- 디렉토리로 존재한다면 경로 뒤
/를 붙이고 redirect - uri에 location에 포함된 확장자가 붙어있는 경우 cgi build
- 모두 아닌 경우 static build
- fullPath 만들어서 request에 저장
- request에서 헤더 정보를 보고 response에 필요한 헤더 추가해주기
- redirection 구현
- cgi 구현
- QUERY_STRING 값에서 % 들어가 있는 거 치환
- config 검사
- location uri 중 root 블록 무조건 있게 하기
- 둘 다 /로 시작해야 함
- client_max_body_size가 허용하지 않는 큰 값이 들어올 경우 예외 발생
- limit_except에서 허용하지 않는 메서드가 들어왔을 경우 예외 발생
- index 에 적힌 결과가 파일이 아닌 경우 예외 발생
- root와 locationUri는 디렉토리로 가정
- 형식이 올바르지 않은 경우
- autoindex 값이 on, off가 아닌 경우
- error_page의 code가 4XX대, 5XX가 아닌 경우 예외 발생
- cgi_path와 업로드 경로 존재 여부 확인
- 업로드 경로가 디렉토리인지 확인
- port가 잘 알려진 포트가 아닌지 확인
- location uri 중 root 블록 무조건 있게 하기
- request 값 유효성 검사
- 테스터 돌리면서 고쳐야 할 부분 찾기
- return → redirect로 수정하는게 어떨까?
- 네! limit_expect도 allow_method로 변경하기!
- Builder에서 isDone 위치 상의해서 맞추기
- 헤더 위치 통일
- 에러코드 5203번 403에서 404로 변경
[ CGI 환경변수 탐색 (cgi_tester 기준) ]
- REQUEST_METHOD
- SERVER_PROTOCOL: HTTP/1.1
- PATH_INFO
- CGI 총 정리
Connection: close
- 응답 완료 후 이 커넥션이 닫힘을 발신자에게 알리기 위해 정의됨
- 요청 또는 응답 헤더 필드는 현재 요청/응답이 완료 후 발신자가 커넥션을 닫을 것임을 나타낸다.
- 프로토콜 버전과 Connection 헤더 필드(가 존재하는 경우)를 기반으로 커넥션이 지속되는지 여부를 확인한다.
- close → 무조건 끊음
- HTTP/1.1인데 close가 아닌 경우는 유지
- HTTP/1.0인데 keep-alive 커넥션 옵션이 존재 → 유지
-
X- 헤더
- 웹 서버는 HTTP 헤더를 환경 변수로 변환하여 CGI 스크립트에 전달합니다. 이때, 모든 HTTP 헤더는
HTTP_접두사를 갖게 되며, 하이픈(-)은 언더스코어(_)로 변환됩니다. 예를 들어, **X-Example-Header**는 **HTTP_X_EXAMPLE_HEADER**라는 환경 변수로 변환됩니다.
- 웹 서버는 HTTP 헤더를 환경 변수로 변환하여 CGI 스크립트에 전달합니다. 이때, 모든 HTTP 헤더는
-
config example
# Server 1 server { listen 127.0.0.1:8080; server_name test.com www.test.com; location / { root /var/www/html; index index.html; limit_except GET POST; client_max_body_size 10000000; autoindex off; error_page 404 /404.html; } location /images/ { root /var/www/images; index index.html; limit_except GET; autoindex on; } location /docs/ { root /var/www/docs; index index.html; limit_except GET; autoindex off; } } # Server 2 server { listen 127.0.0.1:8080; server_name test.org www.test.org; location / { root /var/www/html; index index.html; limit_except GET; client_max_body_size 8000000; autoindex on; } location /media/ { root /var/www/media; index index.html; limit_except GET POST; autoindex off; } } # Server 3 server { listen 127.0.0.1:8081; server_name test.com www.test.com; location / { root /var/www/html; index index.html; limit_except GET POST DELETE; client_max_body_size 15000000; autoindex off; error_page 500 /500.html; error_page 403 /403.html; } location /api/ { root /var/www/api; index index.php; limit_except GET POST; client_max_body_size 10000000; autoindex off; } location /downloads/ { root /var/www/downloads; index index.html; limit_except GET; autoindex on; } }
-
CGI
-
CGI PATH에는 직접 만든 CGI를 지정
-
PATH_INFO로 실행할 .py 파일을 전달
-
.py파일 실행파일로 만들기
[09. 실행파일 만들기 (PyInstaller)(https://wikidocs.net/21952)
-
-
POST, DELETE 공통
- PATH_INFO로 해당 작업을 직접 실행할 CGI 지정
- HTTP_X_TARGET_FILE이라는 커스텀 환경변수로 path로 들어온 경로 전달
-
POST
- 동일한 이름의 파일이 존재할 경우 → 파일 업로드 실패, 400 Bad Request
- 파일 이름이 올바르지 않을 경우(빈 문자열) → 파일 업로드 실패, 400 Bad Request
- 파일이 선택되지 않은 채 post 요청이 온 경우 → 파일 업로드 실패, 400 Bad Request
- 파일 업로드 성공 → 201 Created
- 작업 진행 중 예상치 못한 예외 발생 → 500 Internal Server Error
-
DELETE
- 존재하지 않는 파일인 경우 → 파일 삭제 실패, 204 No Content
- 파일 삭제 성공 → 202 Accepteds
- 작업 진행 중 예상치 못한 예외 발생 → 500 Internal Server Error
-
의문점: 서버에
location /에 대한 정의만 있는 경우-
POST localhost:8080/hello/wonyang.png라는 요청이 들어왔을 때, hello 디렉토리 안에 wonyang.png를 업로드하는 것이 맞는가?
-
DELETE localhost:8080/hello/wonyang.png라는 요청이 들어왔을 때, hello 디렉토리 안에 wonyang.png를 제거하는 것이 맞는가?
-
target uri:
/hello/wonyang.png는 어떻게 처리해야 할까??
-
-
처리
- /cgi-bin/file-manager.py와 같은 cgi 호출을 제외한 post요청은 모두 잘못된 것으로 판단
- 업로드되는 파일 경로는 config 내에 명시되어 있는 경로
- body에 있는 파일명에 디렉토리 경로가 포함되어 오는 경우? → 보통 에러로 처리
- DELETE 요청의 경우 target uri 내에 디렉토리 경로(/)가 명시되어 있는 경우 오류로 처리 (?)
- DELETE 요청이 들어오면 target uri에 있는 파일을 config에 명시되어 있는 파일 경로에서 찾아 삭제
- 허용 함수 정리
- 소켓 프로그래밍
- CGI
- 가상 호스트
- NGINX autoindex 동작 정리
- HTTP Request 파싱
- HTTP Request 값 유효성 검사
- Config 파일 Parsing