CS

[컴퓨터 네트워크] 응용 계층 - 웹

ruby 2023. 6. 9. 00:38

1. 웹 서비스

클라이언트 - 서버 모델

  • 웹 (WWW→ World Wide Web) 서버의 TCP 포트 번호 80번으로 지정

  • URL (Uniform Resource Locator)

    • 웹 서버 지칭

    • 프로토콜, 연결하는 서버의 호스트 이름, 서버 내부의 파일 경로명으로 표현

      https://www.korea.co.kr/welcome.html
      프로토콜 이름 / 웹 서버 host 이름 / 서버 내부의 파일 경로명
    • 유닉스, 리눅스 시스템에서의 웹 서버 구현

      http://www.korea.co.kr/~hong
      // 로그인 이름 : hong
      // 홈 디렉토리 : /public_html/index.html

웹 서비스의 동작 원리

  1. 사용자가 웹 브라우저에 URL 입력
  2. 클라이언트는 서버 호스트 이름을 DNS 서버에 전송하여 서버의 IP주소를 얻음
    • DNS 응답 수신 전까지 인터넷이 안됨
  3. IP주소와 Well-known 포트 80번을 이용하여 웹 서버와 TCP 연결(3-hand shake)시도
    • 해당 목적지 주소로 데이터 패킷을 생성하여 전송
  4. TCP연결이 설정되고 클라이언트가 서버에게 GET 명령(html, css등)을 전송
  5. 서버가 클라이언트에게 요청받은 웹 문서 회신
  6. 둘 사이의 TCP 연결 해제
  7. 웹 브라우저는 해당 파일의 내용 사용자가 볼 수 있게끔 화면에 표시

APM의 웹 서비스 구조

  • APM : Apache + PHP + MySQL

    • Apache : 웹 서버 프로그램, 계속 80번 포트를 열고 프로세스를 돌림
    • PHP
      • 동적 문서를 생성하는 프로그래밍 언어
      • HTML 언어의 기능을 보완하여 문서 내부에 PHP 코드를 추가하는 형식
      • 모든 종류의 운영체제에서 지원(ASP는 Window에서만 작동)
      • 공개용 데이터베이스인 MySQL과도 연동이 쉬움
    • MySQL : 동적인 부분을 채워줄 데이터베이스
  • APM 관점에서의 웹 서비스의 동작 원리

    1. 웹 브라우저가 Apache에 웹 문서 요청

    2. PHP 코드 처리 필요 시 PHP에게 요청

    3. 데이터베이스 처리 필요 시 MySQL에게 요청

    4. 데이터베이스 결과 회신

    5. PHP가 실행 결과인 HTML 코드 회신

    6. 웹 문서를 웹 브라우저에 회신

PHP 코드의 처리

  • HTML 문서 내용의 일부로 작성
  • 구분자 사용
  • PHP 코드가 포함된 HTML 문서는 확장자가 .php임
  • PHP 코드는 서버에서 실행되고 결과만 회신된다
// 서버에서 작성한 문서
<HTML>
    <BODY>
        <? $value = 10;?>
        출력<br>
        <? echo $value;?>
    </BODY>
</HTML>
// 클라이언트에서 확인되는 문서
<HTML>
    <BODY>
        출력<br>
        10
    </BODY>
</HTML>

2. HTML

  • HTML이란

    • HyperText Markup Language로 웹 문서를 작성하는 언어임
    • 어느 위치에 어떤 데이터를 어떤 모양으로 표시할지 tag등으로 나타냄
    • HTML 문서는 웹 서버에 보관됨
    • 웹 브라우저는 클라이언트에게 HTML 문서를 해석해서 나타냄
  • HTML 문서의 구조

    • 헤더와 바디로 구성

    • 시작 tag와 끝 tag로 감싸는 형식임

      <HTML>
            <HEAD>
                    <TITLE> HTML의 예 </TITLE>
            </HEAD>
            <BODY>
                    HTML 문서의 내용
            </BODY>
      <HTML>

3. HTTP

  • HTTP란

    • HyperText Transfer Protocol
    • 웹 문서를 전송하는 프로토콜
    • HTTP: TCP 포트 80번 사용
  • HTTP의 요청과 응답 (RFC 2616으로 발표된 HTTP 1.1 버전)

    • 클라이언트의 요청과 서버의 응답에 의해 동작하는 간단한 프로토콜
    • 동작 원리
      • HTTP 클라이언트가 서버에 요청 전송(요청 메서드, URL, HTTP 버전과 기타 부가 정보 포함)
      • HTTP 서버가 요청의 결과인 응답 코드가 포함된 정보를 회신
  • 비상태 연결

    • 요청과 응답 이후, 연결이 끊어지므로 비상태 프로토콜
    • state-less protocol
    • web 문서가 클 경우 복잡하므로 연결 존재에 따른 상태정보를 저장하지 않음
  • MIME 유사 메시지

    • HTTP의 요청 및 응답 메세지는 MIME 유사 구조를 사용해 데이터 전송
    • MIME : Multipurpose Internet Message Extensions
    • 대용량 binary file, ASCII code encoding 가능 등 다양한 메세지를 지원
  • 요청

    • 요청 메시지 구조

      | 요청문(Request Line) | <요청 메서드> <URL> <HTTP 버전> (예 GET /file HTTP/1.1)
      | 헤더(Header) | <헤더 이름> : <헤더 값> |
      | 공백 한 줄 |
      | 바디(Body) |
    • 요청 메서드: 클라이언트가 서버에 실행을 요구하는 명령

    • 요청 메서드의 명령

      | GET | 클라이언트가 서버에 URL이 가리키는 웹 문서의 내용을 전송하도록 요구
                    문서의 내용은 서버가 회신하는 응답 메시지의 바디에 포함 |
      | HEAD | 문서 내용보다는 특정 문서의 정보를 원할 때 사용 |
      | POST | 클라이언트가 서버에 정보를 전송
                    게시판, 방명록과 같이 사용자가 입력한 정보를 서버에 전달하는 용도로 사용 |
      | PUT | 클라이언트가 서버에 문서를 전달하려고 사용
                    문서 내용은 바디에 포함 |
  • 응답

    • 응답 메시지 구조

      | 상태문( Status Line) | <HTTP 버전> <상태 코드> <상태 이름> |
      | 헤더 (Header) |
      | 공백 한 줄 |
      | 바디 (Body) |
    • 상태 코드

      코드 이름 의미
      200 OK 요청이 성공적으로 수행
      202 Accepted 클라이언트의 요청을 수신하였으나, 즉각 실행되지 않고 있다
      400 Bad Request 요청 메시지의 내용에 문법 오류가 존재한다
      401 Unauthorized 요청을 실행하는 데 필요한 적절한 권한이 존재하지 않는다
      403 Forbidden 서비스 요청이 거부되었다
      404 Not Found 원하는 문서를 찾을 수 없다
      500 Internal Server Error 서버 내부에 불가피한 오류가 발생하였다
      501 Not Implemented 요청 사항을 수행할 수 없다
  • HTTP의 동작 과정

    1. 요청 메시지

      GET /index.php HTTP/1.1 # 요청문
      Host: uu.ac.kr # 헤더
                  # 공백 한 줄
    2. 응답 메시지

      HTTP/1.1 200 OK                      # 상태문 
      Date: Thu, 12, Feb 2023 03:45:32 GMT # 헤더
      Server: Apache/1.3.29 ~~
      ~~
      ~~
      ~~
                                        # 공백 한 줄
      <HTML>                               # 바디
           <HEAD> 
      ~~~~
      </HTML>