public:computer:http

HTTP

  • HTTP1.1; RFC 2616
  • Uniform 인터페이스, 스테이트리스 서버, 캐시 등을 구현하고 있는 Web의 기반 프로토콜
  • TCP/IP 기반 Transmission Control Protocol / Internet Protocol
    • 계층형 프로토콜
    • 네트워크 인터페이스 계층
    • 인터넷 계층; IP에 해당, 기본단위 패킷Packet
    • 트랜스포트 계층; TCP에 해당, 커넥션 연결을 사용해 데이터의 누락 체크, 데이터의 도달 보증, 포트번호 1~65535, HTTP의 디폴트 80번.
    • 애플리케이션(응용) 계층; 메일, DNS, HTTP를 실현,
계층형 프로토콜
애플리케이션 계층 HTTP, NTP, SSH, SMTP, DNS
트랜스포트 계층 UDP, TCP
인터넷 계층 IP
네트워크 인터페이스 계층 이더넷
  • HTTP 0.9; GET
  • HTTP 1.0; RFC 1945, 헤더 도입, GET 이외의 메서드 추가.
  • HTTP 1.1; RFC 2068, RFC 2616, HTTP 1.0의 기능에 더해 채널 전송, Accept 헤더에 의한 콘텐트 네고시에이션, 복잡한 캐시 컨트롤, 지속적 연결 등 추가.
  • 클라이언트/서버; Request / Response. Request-Response Style 프로토콜, HTTP는 동기형 Synchronous 프로토콜
  • 클라이언트
    1. 요청 메시지 구축
    2. 요청 메시지 송신
    3. (응답이 돌아올 때까지 대기)
    4. 응답 메시지 수신
    5. 응답 메시지 해석
    6. 클라이언트의 목적을 달성하기 위해 필요한 처리
  • 서버
    1. (요청을 대기)
    2. 요청 메시지 수신
    3. 요청 메시지 해석
    4. 적절한 애플리케이션 프로그램으로 처리를 위임
    5. 애플리케이션 프로그램으로부터 결과를 취득
    6. 응답 메시지 구축
    7. 응답 메시지 송신
  • 요청 메시지
    • GET /test HTTP/1.1
      Host: example.com
      • 요청라인 Request-Line; 메서드 GET, 요청 URI/test, 프로토콜 버전 HTTP/1.1로 구성
      • 헤더; 이름:값 구성
      • 바디;
  • 응답 메시지
    • HTTP/1.1 200 OK
      Content-Type: application/xhtml+xml; charset=utf-8
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      ....
      </html>
      • 스테이터스 라인 Status Line; 프로토콜 버전 HTTP/1.1, 스테이터스 코드 200, 텍스트 구문OK 으로 구성
      • 헤더; MIME Multipurpose Internet Mail Extension 미디어 타입 application/xhtml+xml과 그 문자 인코딩 방식 utf-8 지정
      • 바디; 헤더와 바디는 빈 줄로 구분
  • HTTP 메시지의 구성 요소
HTTP 메시지의 구조
스타트 라인(Start Line)
헤더(Header)
빈 줄(blank Line)
바디(Body)
  • HTTP의 스테이트리스성
    • 애플리케이션 상태; Session State
    • 자기 기술적 메시지 Self Descriptive Message
HTTP 메서드
메서드 의미
GET 리소스 취득
POST 서브 리소스의 작성, 리소스 데이터의 추가, 그 밖의 처리
PUT 리소스 갱신, 리소스 작성
DELETE 리소스 삭제
HEAD 리소스의 헤더(메타 데이터) 취득
OPTIONS 리소스가 서포트하는 메서드의 취득
TRACE 자기 앞으로 요청 메시지를 반환(루프 백) 시험
CONNECT 프록시 동작의 터널 접속으로 변경
  • CRUD 성질 충족; GET, POST, PUT, DELETE
CRUD와 HTTP 메서드의 대응
CRUD 명 의미 메서드
Create 작성 POST/PUT
Read 읽기 GET
Update 갱신 PUT
Delete 삭제 DELETE
  • GET - 리소스의 취득
  • POST - 리소스의 작성, 추가
  • PUT - 리소스의 갱신, 작성
  • DELETE - 리소스의 삭제
  • HEAD - 리소스의 헤더 취득
  • OPTIONS - 리소스가 서포트하는 메서드의 취득
  • POST를 PUT/DELETE 대신 사용하기도 한다
    • _method 파라미터
    • X-HTTP-Method-Override
  • 조건부 요청 Conditional Request;
  • 멱등성Idempotence과 안전성Safe
HTTP 메서드의 성질
메서드 성질
GET, HEAD 멱등이고 안전하다
PUT, DELETE 멱등이지만 안전하지 않다
POST 멱등이지도 안전하지도 않다
  • 1xx; 처리중, 처리가 계속되고 있음을 나타낸다. 클라이언트는 그대로 요청을 계속하던지 서버의 지시에 따라 프로토콜을 업데이트 하여 재전송
  • 2xx; 성공, 요청이 성공했음을 나타냄
  • 3xx; 리다이렉트, 다른 리소스로의 리다이렉트를 나타낸다. 클아이언트는 이 스테이터스 코드를 받았을 때 응답메시지의 Location 헤더를 보고 새로운 리소스로 접속
  • 4xx; 클라이언트 에러, 클라이언트 에러를 나타낸다. 원인은 클라이언트의 요청에 있다. 에러를 해결하지 않는 한, 정상적인 결과를 얻을 수 없기 때문에 같은 요청을 그대로 재전송할 수는 없다.
  • 5xx; 서버 에러, 서버 에러를 나타낸다. 원인이 서버에 있다. 서버 측의 원인이 해결되면, 동일한 요청을 재전송해서 정상적인 결과를 얻을 가능성이 있다
  • 200 OK - 요청 성공
  • 201 Created - 리소스 작성 성공
  • 301 Moved Permanently - 리소스의 항구적인 이동
  • 303 See Other - 다른 URI의 참조
  • 400 Bad Request - 요청 오류
  • 401 Unauthorized - 접근 권한 없음, 인증 실패
  • 404 Not Found - 리소스 없음
  • 500 Internal Server Error - 서버 내부 에러
  • 503 Service Unavailable - 서비스 정지
  • 스테이터스 코드와 에러처리
    • 프로토콜에 따른 포맷으로 에러른 반환
    • Accept 헤더에 따른 포맷으로 에러를 반환
  • 전자메일의 메시지 스펙 RFC822의 헤더형식을 빌려오는 식으로 추가, 메일 프로토콜이 한 방향으로 주고 받지만 One-Way, HTTP는 한 번의 통신으로 요청/응답의 두 가지 메시지를 주고 받음
  • 날짜와 시간
날짜 시간을 가지는 헤더
이용하는 메시지 헤더 의미
요청과 응답 Date 메시지를 생성한 일시
요청 If-Modified-Since 조건부 GET으로 리소스의 갱신일시를 지정할 때 이용한다
If-Unmodified-Since 조건부 PUT, 조건부 DELETE로 리소스의 갱신일시를 지정할 때 이용한다
응답 Expires 응답을 캐시할 수 있는 기한
Last-Modified 리소스를 마지막으로 생신한 일시
Retry-After 다시 요청을 전송할 수 있는 일시의 기준
  • MIME 미디어 타입
    • Content-Type - 미디어 타입 지정
타입
타입 의미
text 사람이 읽고 직접 이해할 수 있는 텍스트 text/plain
image 그림 데이터 image/jpeg
audio 음성 데이터 audio/mpeg
video 동영상 데이터 video/mp4
application 그 밖의 데이터 application/pdf
multipart 복수의 데이터로 이루어진 복합 데이터 multipart/related
message 전자메일 메시지 message/rfc822
model 복수 차원으로 구성하는 모델 데이터 model/vrml
example 예시용 example/foo-bar
  • charset 파라미터 - 문자 인코딩을 지정
주요 서브타입
타입 / 서브타입 의미
text/plain 플레인 텍스트
text/csv CSV형식 텍스트
text/css CSS형식의 스타일 시트
text/html HTML 문서
text/xml XML 문서(비추천)
image/jpeg JPEG 이미지
image/gif GIF 이미지
image/png PNG 이미지
application/xml XML 문서
application/xhtml+xml XHTML 문서
application/atom+xml Atom 문서
application/atomsvc+xml Atom의 서비스 문서
application/atomcat+xml Atom의 카테고리 문서
application/javascript JavaScript
application/json JSON 문서
application/msword Word 문서
application/vnd.ms-excel Excel 문서
application/vns.ms-powerpoint PowerPoint 문서
application/pdf PDF 문서
application/zip ZIP 파일
application/x-shockware-flash Flash 오브젝트
application/x-www-form-urlencoded HTML 폼 형식
  • 언어 태그Language Tag; Content-Language 헤더, RFC 4646 언어 태그 RFC 4647 태그의 비교방법이 정의
  • 콘텐트 네고시에이션
    • Accept - 처리할 수 있는 미디어 타입을 전달
    • Accept-Charset - 처리할 수 있는 문자 인코딩 전달
    • Accept-Language - 처리할 수 있는 언어를 전달
  • Content-Length와 청크(chunk) 전송
    • Content-Length - 바디의 길이를 지정
    • 청크 전송 - 바디를 분할하여 전송
  • 인증; Basic 인증, Digest 인증, 웹 API에서 WSSE WS-Security Extension 확장 스펙
    • Basic 인증; 유저 이름과 패스워드를 Authorization 헤더에 넣어 요청마다 전송. 유저이름:패스워드를 Base64 인코딩, 보안 강도 확인 필요(SSL Secure Socket Layer, TLS Transport Layer Security, HTTPS HTTP over Secure Socket Layer 등)
    • Digest 인증;
      • 첼린지; nonce(number used once), qop(quality of protection) → 'auth'나 'auth-init' 지정, opaque
      • 다이제스트 생성과 송신
    • WSSE 인증;
  • OpenID와 OAuth, SSO Single Sign-on
    • OpenID - 심플한 싱글 사인온; IdP(Identity Provider), SP(Service Provide)
    • OAuth - 웹서비스 사이의 권한의 위임; 인가정보를 넘기는 기능
  • 캐시
    • 캐시용 헤더
      • Pragma - 캐시를 억제
      • Expires - 캐시의 유효기한
      • Cache-Control - 상세한 캐시 방법을 지정
      • 캐시용 헤더의 사용 구분
        • 캐시를 시키지 않을 경우는 Pragma와 Cache-Control의 no-cache를 동시에 지정
        • 캐시의 유효기간이 명확하게 정해저 있는 경우는 Expires를 지정
        • 캐시의 유효기간을 상대적으로 지정하고자 하는 경우는 Cache-Control의 max-age로 상대시간을 지겅
    • 조건부 GET
      • If-Modified-Since - 리소스의 갱신일시를 조건으로 한다
      • If-None-Match - 리소스의 ETag(엔티티 태그)를 조건으로 한다
  • 지속적 접속 Persistent Connection; Pipelining
  • 그 밖의 HTTP 헤더
    • Content-Disposition - 파일명 지정
    • Slug - 파일명과 힌트를 지정
  • HTTP 1.1(RFC2616), WebDAV(RFC4918)
  • 1xx; 처리중
    • 100 Continue
      • 바디: 없음
      • 관련 메서드: 모두
      • 요청 헤더: Expect
    • 101 Switching Protocols
      • 바디: 없음
      • 관련 메서드: 모두
      • 요청 헤더: Upgrade
  • 2xx; 성공
    • 200 OK
      • 바디: GET의 경우는 리소스의 표현, 그 밖의 메서드의 경우는 처리 결과
      • 관련 메서드: 모두
    • 201 Created
      • 바디: 신규 작성된 리소스의 표현, 혹은 처리결과의 설명
      • 관련 메서드: POST, PUT
      • 요청 헤더: Location
    • 202 Accepted
      • 바디: 처리 결과를 얻을 수 있는 리소스의 링크와 예상처리 시간
      • 관련 메서드: 모두
      • 요청 헤더: Location, Retry-After
    • 203 Non-Authoritative Information
      • 바디: GET의 경우는 리소스의 표현, 그 밖의 메서드의 경우는 처리 결과
      • 관련 메서드: 모두
    • 204 No Content
      • 바디: 없음
      • 관련 메서드: POST, PUT, DELETE
    • 205 Reset Content
      • 바디: 없음
      • 관련 메서드: 모두
    • 206 Partial Content
      • 바디: 지정된 범위의 리소스 표현
      • 관련 메서드: GET
      • 요청 헤더: Range, If-Range
      • 응답 헤더: Content-Range
    • 207 Multi-Status
      • 바디: WebDAV가 정의하는 멀티 스테이터스를 표현하는 XML 문서
      • 관련 메서드: POST
  • 3xx; 리다이렉트
    • 300 Multiple Choices
      • 바디: 후보 URI의 리스트
      • 관련 메서드: 모두
    • 301 Moved Permanently
      • 바디: 이동할 곳의 URI 링크를 포함한 HTML
      • 관련 메서드: 모두
      • 응답 헤더: Location
    • 302 Found
      • 바디: 이동할 곳의 URI 링크를 포함한 HTML
      • 관련 메서드: POST
      • 응답 헤더: Location
    • 303 See Other
      • 바디: 이동할 곳의 URI 링크를 포함한 HTML
      • 관련 메서드: POST
      • 응답 헤더: Location
    • 304 Not Modified
      • 바디: 없음
      • 관련 메서드: GET
      • 요청 헤더: If-Modified-Since, If-None-Match
      • 응답 헤더: ETag, Last-Modified
    • 305 Use Proxy
      • 바디: 프록시가 필요하다는 것을 설명하는 HTML
      • 관련 메서드: 모두
      • 응답 헤더: Location
    • 307 Temporary Redirected
      • 바디: 이동할 곳의 URI 링크를 포함한 HTML
      • 관련 메서드: 모두
      • 응답 헤더: Location
  • 4xx; 클라이언트 에러
    • 400 Bas Request
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 401 Unauthorized
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 요청 헤더: Authorization
      • 응답 헤더: WWW-Authenticate
    • 402 Payment Required
      • 바디: 결제방식을 설명하는 문서
      • 관련 메서드: 모두
    • 403 Forbidden
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 404 Not Found
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 405 Method Not Allowed
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 응답 헤더: Allow
    • 406 Not Acceptable
      • 바디: 후보 URI 리스트
      • 관련 메서드: 모두
      • 요청 헤더: Accept, Accept-Charset, Accept-Language, Accept-Encoding, Accept-Range
    • 407 Proxy Authentication Required
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 요청 헤더: Proxy-Authorization
      • 응답 헤더: Proxy-Authenticate
    • 408 Request Timeout
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 응답 헤더: Connection
    • 409 Conflict
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: PUT, POST, DELETE
      • 응답 헤더: Location
    • 410 Gone
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 411 Length Required
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 요청 헤더: Content-Length
    • 412 Precondition Failed
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: PUT, POST
      • 요청 헤더: If-Match, If-None-Match, If-Unmodified-Since
      • 응답 헤더: ETag, Last-Modified
    • 413 Request Entity Too Large
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 응답 헤더: Connection
    • 414 Request-URI Too Long
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 415 Unsupported Media Type
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: PUT, POST
      • 요청 헤더: Content-Type
    • 416 Requested Range Not Satisfiable
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: GET
      • 요청 헤더: Range
    • 417 Expectation Failed
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 요청 헤더: Expect
    • 422 Unprocessable Entity
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: POST, PUT
    • 423 Locked
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: PUT, COPY, MOVE, LOCK
    • 424 Failed Dependency
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
  • 5xx; 서버 에러
    • 500 Internal Server Error
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 501 Not Implemented
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 502 Bad Gateway
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 503 Service Unavailable
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
      • 응답 메서드: Retry-After
    • 504 Gateway Timeout
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
    • 505 HTTP Version Not Supported
      • 바디: 에러의 이유를 설명하는 문서
      • 관련 메서드: 모두
  • 서버 정보
    • Date
      • 이용하는 메시지: 요청, 응답
      • 값: 일시
    • Retry-After
      • 이용하는 메시지: 응답
      • 값: 일시 또는 수치(초)
      • 관련 스테이터스 코드: 202 Accepted, 503 Service Unavailable
    • Server
      • 이용하는 메시지: 응답
      • 값: 서버 소프트웨어의 명칭과 버전
    • Set-Cookie
      • 이용하는 메시지: 응답
      • 값: 문자열
      • Cookie의 스펙 RFC2965
  • 클라이언트 정보
    • Cookie
      • 이용하는 메시지: 요청
      • 값: 문자열
    • Expect
      • 이용하는 메시지: 요청
      • 값: 100-continue
      • 관련 스테이터스 코드: 100 Continue, 417 Expectation Failed
    • From
      • 이용하는 메시지: 요청
      • 값: 메일 주소
    • Referer
      • 이용하는 메시지: 요청
      • 값: URI
    • User-Agent
      • 이용하는 메시지: 요청
      • 값: 클라이언트 소프트웨어의 명칭과 버전
  • 리소스 정보
    • Content-Encoding
      • 이용하는 메시지: 요청, 응답
      • 값: 압축방식
    • Content-Language
      • 이용하는 메시지: 요청, 응답
      • 값: 언어 태그
    • Content-Length
      • 이용하는 메시지: 요청, 응답
      • 값: 10진수 값(바이트)
    • Content-MD5
      • 이용하는 메시지: 요청, 응답
      • 값: MD5 해시값
    • Content-Type
      • 이용하는 메시지: 요청, 응답
      • 값: 미디어 타입
    • Content-Location
      • 이용하는 메시지: 응답
      • 값: URI
    • Last-Modified
      • 이용하는 메시지: 응답
      • 값: 일시
    • Location
      • 이용하는 메시지: 응답
      • 값: URI
    • Host
      • 이용하는 메시지: 요청
      • 값: 호스트명과 포트번호
  • 콘텐트 네고시에이션
    • Accept
      • 이용하는 메시지: 요청
      • 값: 미디어 타입의 우선도
      • 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable
    • Accept-Charset
      • 이용하는 메시지: 요청
      • 값: 문자 인코딩의 우선도
      • 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable
    • Accept-Encoding
      • 이용하는 메시지: 요청
      • 값: 압축방식의 우선도
      • 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable
    • Accept-Language
      • 이용하는 메시지: 요청
      • 값: 언어 태그의 우선도
      • 관련 스테이터스 코드: 300 Multiple Choices, 406 Not Acceptable
    • Vary
      • 이용하는 메시지: 응답
      • 값: Accept-* 헤더의 리스트
  • 조건부 요청
    • ETag
      • 이용하는 메시지: 응답
      • 값: Etag의 값을 나타내는 문자열
    • If-None-Match
      • 이용하는 메시지: 요청
      • 값: ETag
      • 관련 메서드: GET
    • If-Modified-Since
      • 이용하는 메시지: 요청
      • 값: 일시
      • 관련 메서드: GET
    • If-Match
      • 이용하는 메시지: 요청
      • 값: ETag
      • 관련 메서드: PUT, DELETE
      • 관련 스테이터스 코드: 412 Precondition Failed
    • If-Unmodified-Since
      • 이용하는 메시지: 요청
      • 값: 일시
      • 관련 메서드: PUT, DELETE
      • 관련 스테이터스 코드: 412 Precondition Failed
  • 부준적 GET
    • Range
      • 이용하는 메시지: 요청
      • 값: 취득하고 싶은 부분(바이트)
      • 관련 메서드: GET
    • If-Range
      • 이용하는 메시지: 요청
      • 값: ETag 또는 일시
      • 관련 메서드: GET
    • Accept-Range
      • 이용하는 메시지: 응답
      • 값: bytes 또는 none
      • 관련 메서드: GET, HEAD
      • 관련 스테이터스 코드: 206 Partial Content
    • Content-Range
      • 이용하는 메시지: 응답
      • 값: 바이트 폭
      • 관련 메서드: GET
      • 관련 스테이터스 코드: 206 Partial Content
  • 캐시
    • Pragma
      • 이용하는 메시지: 요청, 응답
      • 값: no-cache
    • Cache-Control
      • 이용하는 메시지: 요청, 응답
      • 값: 스펙에서 정해진 컨트롤 식별자 no-cache, max-age: xxxx 등
    • Expires
      • 이용하는 메시지: 응답
      • 값: 일시
    • Age
      • 이용하는 메시지: 응답
      • 값: 경과시간(초)
  • 인증
    • WWW-Authenticate
      • 이용하는 메시지: 응답
      • 값: 인증방식
      • 관련 스테이터스 코드: 401 Unauthorized
    • Authorization
      • 이용하는 메시지: 요청
      • 값: 인증방식
      • 관련 스테이터스 코드: 401 Unauthorized
    • Proxy-Authenticate
      • 이용하는 메시지: 응답
      • 값: 인증방식
      • 관련 스테이터스 코드: 407 Proxy Authentication Required
    • Proxy-Authorization
      • 이용하는 메시지: 요청
      • 값: 인증방식
    • X-WSSE
      • 이용하는 메시지: 요청
      • 값: 인증방식
  • 청크 전송
    • Transfer-Encoding
      • 이용하는 메시지: 요청, 응답
      • 값: chunked
    • Trailer
      • 이용하는 메시지: 응답
      • 값: 헤더명 리스트
    • TE
      • 이용하는 메시지: 요청
      • 값: trailer
  • 기타
    • Allow
      • 이용하는 메시지: 응답
      • 값: 메서드 리스트
      • 관련 메서드: OPTIONS
      • 관련 스테이터스 코드: 405 Method Not Allowed
    • Connection
      • 이용하는 메시지: 응답, 요청
      • 값: close
    • Max-Forward
      • 이용하는 메시지: 요청
      • 값: 수치(횟수)
      • 관련 메서드: TRACE, OPTIONS
    • Upgrade
      • 이용하는 메시지: 요청, 응답
      • 값: 프로토콜 리스트
      • 관련 스테이터스 코드: 101 Switching Protocols
    • Via
      • 이용하는 메시지: 요청, 응답
      • 값: 중개자의 호스트명, 포트번호, 프로토콜 버전
    • Warning
      • 이용하는 메시지: 응답
      • 값: 에러 코드와 텍스트 구문
    • Content-Disposition
      • 이용하는 메시지: 요청, 응답
      • 값: 문자열
    • Slug
      • 이용하는 메시지: 요청
      • 값: %인코딩한 문자열
      • 관련 메서드: POST
    • X-HTTP-Override
      • 이용하는 메시지: 요청
      • 값: HTTP 메서드밍
      • 관련 메서드: POST
  • public/computer/http.txt
  • Last modified: 2021/12/29 15:10
  • by alex