Skip to content

회의록 | 4주차

jeongmin edited this page Feb 2, 2024 · 1 revision

기간: 24.01.22 ~ 24.01.28

1월 22일

이 전에 root와 index를 활용하여 최종 uri를 확정한다.

  • index 파일을 디렉토리에 붙였을 때 있는 경우 붙여야 함 두둥
  1. / (루트)를 제외하고 디렉토리 경로(/로 끝나는 uri)인 경우 DirectoryBuilder로 분기
  2. 로케이션 블록에서 지원하는 cgi extension이 포함된 파일인 경우 CGI Builder로 분기
  3. 이 외의 경우 Static(GET / HEAD) Builder로 분기
  • 중간에 리다이렉션 있으면 Builder Generator로 변경
  • 1, 2, 3에서 예외 발생 시 Builder를 Error Builder로 변경

autoindex builder 구현하면서 수정 필요하다고 생각했던 부분

  • 현재 구현된 상태는 root 디렉토리에 / 가 붙어있다고 가정되어있기 때문에 config 블럭 파싱 구현 시 /가 없다면 추가해주어야 함
  • fullPath를 만드는 부분이 build 함수 내부에서 구현되었는데, 추후 반복적으로 쓰일 것 같아 파싱 끝나고 한번 생성하는 부분으로 함수화
  • 파일에 대한 존재 여부, 권한 여부 또한 반복적으로 사용될 것 같아 Util에 함수화 필요

1월 23일

[ selectResponseBuilder 함수 구현]

  • 이 전에 허용되지 않는 메서드인 경우 405 예외 발생
  • path가 예쁘게 만들어졌다고 가정
  1. return이 location 블록에 존재할 경우 해당 경로로 redirection
  2. 디렉토리 경로인 경우
    • index 파일을 붙이고 파일이 존재하면 4번으로 이동
    • 파일이 존재하지 않으면 autoindex build
  3. uri에 해당하는 파일이 없으면 404 날려
  4. 디렉토리로 존재한다면 경로 뒤 / 를 붙이고 redirect
  5. uri에 location에 포함된 확장자가 붙어있는 경우 cgi build
  6. 모두 아닌 경우 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가 잘 알려진 포트가 아닌지 확인
  • request 값 유효성 검사
  • 테스터 돌리면서 고쳐야 할 부분 찾기

1월 24일

  • 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 커넥션 옵션이 존재 → 유지

1월 25일

  • X- 헤더

    X-Forwarded-For - HTTP | MDN

    • 웹 서버는 HTTP 헤더를 환경 변수로 변환하여 CGI 스크립트에 전달합니다. 이때, 모든 HTTP 헤더는 HTTP_ 접두사를 갖게 되며, 하이픈(-)은 언더스코어(_)로 변환됩니다. 예를 들어, **X-Example-Header**는 **HTTP_X_EXAMPLE_HEADER**라는 환경 변수로 변환됩니다.
  • 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;
        }
    }
    

1월 27일

  • 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에 명시되어 있는 파일 경로에서 찾아 삭제

Clone this wiki locally