[Sprint] 리눅스 실습

💡 사전 준비 – access log 다운로드 하기

access.log 파일은 웹 서버에 접속한 기록을 쌓아놓은 로그 파일입니다.

보통 시스템 관리자는 이 로그를 분석하여, 웹 사이트의 접속 통계를 낼 수 있습니다. 이를 통해 어떤 IP에서 많이 접속했는지, 언제 접속했는지, 어떤 주소에 접속했는지, 어떤 브라우저에서 접속했는지 등을 알 수 있습니다.

제공되는 원격 서버로 접속한 후, 이 access.log 파일을 다운로드 받아, 홈 디렉토리에 저장해봅시다.

Quest #1

Q. 이 파일은 공백을 기준으로 각 필드를 구분할 수 있습니다. 각 필드는 어떤 의미를 담고 있을까요? 한번 연구해보세요

예시) 66.249.73.135 – – [20/May/2015:20:05:54 +0000] "GET /blog/tags/sysadmin HTTP/1.1" 200 40797 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25

1. 66.249.73.135

서버에 요청한 클라이언트의 IP 주소, 사용자 컴퓨터와 웹서버 사이에 프록시 서버가 존재한다면 프록시 서버의 주소가 기록된다.

2. –

REMOTE_IDENT (RFC 931 identification) RFC931은 인터넷 프로토콜(IP)을 통해 연결된 원격 사용자의 신원을 확인하기 위한 프로토콜입니다. 이는 일반적으로 원격 서버에 로그인하는 경우에 사용됩니다. Ident Protocol은 사용자가 인터넷 서버에 접속할 때 사용자 이름 정보를 제공하는 프로토콜입니다. 이를 통해 서버는 접속한 사용자의 실제 이름을 확인할 수 있습니다. 따라서 서버는 이 정보를 바탕으로 접속한 사용자의 권한을 확인하고, 접속한 사용자에게 적절한 권한을 부여할 수 있습니다.

3. –

HTTP 인증으로 알아낸 문서를 요청한 사용자의 userid 웹 어플리케이션에서 로그인 기능을 구현하고 세션(session) 관리를 위해 쿠키(cookie)를 사용하는 경우, 쿠키에 저장된 사용자 ID를 추출할 수 있습니다. 요청의 상태코드가 ‘401’ 이라면 사용자가 아직 인증을 거치지 않았으므로, 이 값을 믿으면 안된다.

4. [20/May/2015:20:05:54 +0000]

요청 시간 [일(d)/월(m)/년(y):시(h):분(m):초(s) 마이크로초단위]

5. GET

클라이언트가 요청시 사용한 HTTP Method

6. /blog/tags/sysadmin

클라이언트가 요청한 홈페이지 URL 주소 ( 요청한 자료 & 자료위치 )

7. HTTP/1.1

클라이언트가 요청시 사용한 HTTP Version

💡 HTTP 버전별 특징

HTTP 1.0

  • 커넥션 하나당 요청 하나와 응답 하나만 처리 가능

HTTP 1.1

  • 1.0 의 한계를 개선하여, 지정한 timeout 동안 커넥션을 닫지 않고 여러번의 요청과 응답을 처리 가능
  • 앞 요청의 응답을 기다리지 않고 연속적인 요청을 보내고, 그 순서에 맞춰 응답을 받는 Pipelining 기능 추가
  • 앞 요청의 응답이 오래 걸리면 뒤 요청은 Blocking 되어 버리는 한계가 있음

HTTP 2.0

  • 1.1 버전 Pipelining 기능의 한계를 보완
  • 하나의 커넥션 안에 여러개의 스트림을 가질 수 있게 되어, 다중화 (multiplexing) 가 가능해졌으며, 동시에 여러 요청을 처리할 수 있게 됨
  • 응답의 순서에 의미가 없어졌기 때문에 HOL Blocking 이 해결됨

8. 200

HTTP 상태 코드(HTTP Status Code)

RFC2616에 문서에 기술된 정의로 HTTP 요청 상태의 정보를 기록

세자리 숫자로 이루어져 있으며 각 숫자는 의미 있는 정보를 나타냄

5가지 클래스로 구분

  • 1xx (정보): 요청이 수신되었으며 처리가 진행 중임을 나타냅니다.
  • 2xx (성공): 요청이 성공적으로 처리되었음을 나타냅니다.
  • 3xx (리다이렉션): 요청을 완료하기 위해 추가 조치가 필요함을 나타냅니다.
  • 4xx (클라이언트 오류): 클라이언트 측에서 잘못된 요청을 보냈음을 나타냅니다.
  • 5xx (서버 오류): 서버 측에서 요청을 처리하는 동안 오류가 발생했음을 나타냅니다.

9. 40797

클라이언트에게 보내는 응답 헤더를 제외한 응답 데이터 사이즈 (byte)

10. –

Referrer: HTTP 요청을 보낸 웹 페이지의 URL을 나타냅니다. 웹 사이트나 페이지에서 다른 웹 사이트나 페이지로 사용자를 보내는 역할을 하는 링크를 클릭한 사용자의 이전 웹 사이트나 페이지를 말합니다. 즉, 특정 웹 사이트에서 다른 웹 사이트로 이동할 때, 이전에 방문했던 웹 사이트가 "referrer"입니다. 이 정보는 웹 서버 로그에 저장되며, 웹 마케팅 분석 등에 활용될 수 있습니다.

11. Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

접속한 클라이언트의 User Agent

OS, 디바이스, 웹브라우저 등의 정보를 포함하고 있습니다.

Quest #2

앞서 진행했던 내용을 쉘 스크립트로 실행하고 싶습니다. 단 한번의 명령으로 접속기록이 숫자로 출력될 수 있도록 쉘 스크립트를 구현하세요.

  • 파일 이름은 홈 디렉토리에 access_count.sh 로 생성하세요.
  • 쉘 스크립트는 실행 가능해야 합니다.
  • access_count.sh 구현 시, 각종 출력 관련 명령어(grep , cat등)를 활용하고, 파이프를 이용해 연결하여 구현하면 됩니다.
  • 다음과 같이 실행하여, 357 이라는 숫자가 출력되어야 합니다.
$ touch ./access_count.sh
$ vi ./access_count.sh

[access_count.sh]
#!/bin/sh
cat /home/taekyung-oh/access.log | grep -c 130.237.218.86

$ chmod 764 ./access_count.sh
$ ./access_count.sh
357

Quest #3

앞서 진행했던 내용도 마찬가지로 쉘 스크립트로 실행하고자 합니다. 필터링한 로그가 총 몇줄인지를 출력하는 것과 동시에, 필터링한 로그를 별도로 새로운 파일로 만들어야 합니다.

  • 파일 이름은 홈 디렉토리에 response_200_count.sh 으로 생성하세요.
  • 쉘 스크립트는 실행 가능해야 합니다.
  • 필터링한 로그는 response_200.log로 저장하세요.
  • 다음과 같이 실행하여, 93 이라는 숫자가 출력되어야 합니다.
$ touch ./response_200_count.sh
$ vi ./response_200_count.sh

[response_200_count.sh]
#!/bin/sh
echo ---------[Total Count]--------- > ./response_200.log
tail -n 100 ./access.log | grep -c " 200 " >> ./response_200.log
echo ---------[    Log    ]--------- >> ./response_200.log
tail -n 100 ./access.log | grep " 200 " >> ./response_200.log
tail -n 100 ./access.log | grep -c " 200 "

$ chmod 764 ./response_200_count.sh
$ ./response_200_count.sh
93

💡 응용 실습

#!/bin/sh
# 반복되는 명령어 구문을 변수에 할당 후 재사용
LOG_CONTENT=$(tail -n 100 ./access.log)

echo ---------[Total Count]--------- > ./response_200.log
echo "$LOG_CONTENT" | grep -c " 200 " >> ./response_200.log
echo ---------[    Log    ]--------- >> ./response_200.log
echo "$LOG_CONTENT" | grep " 200 " >> ./response_200.log
echo "$LOG_CONTENT" | grep -c " 200 "

Leave a Comment