cURL을 사용하여 요청 및 응답 시간을 한 번에 어떻게 측정합니까?


659

JSON 형식의 데이터를 수신하고 처리 한 다음 결과를 요청자에게 반환하는 웹 서비스가 있습니다.

를 사용하여 요청, 응답 및 총 시간을 측정하고 싶습니다 cURL.

내 예제 요청은 다음과 같습니다.

curl -X POST -d @file server:port

현재 timeLinux에서 다음 명령을 사용하여이를 측정합니다 .

time curl -X POST -d @file server:port

시간 명령은 시간 만 측정 하지만 이것은 내가 찾고있는 것이 아닙니다.

를 사용하여 요청 및 응답 시간을 측정하는 방법이 cURL있습니까?

답변:


1676

이 화려한 블로그 게시물에서 ... https://blog.josephscott.org/2011/10/14/timing-details-with-curl/

컬 지원 요청의 세부 정보 (참조 출력 포맷 내용은 컬을 맨 아래 -w, –write-out <format>). 우리의 목적을 위해 제공된 타이밍 세부 사항에만 중점을 둘 것입니다. 아래 시간은 초 단위 입니다.

  1. curl-format.txt라는 새 파일을 만들고 다음에 붙여 넣습니다.

        time_namelookup:  %{time_namelookup}s\n
           time_connect:  %{time_connect}s\n
        time_appconnect:  %{time_appconnect}s\n
       time_pretransfer:  %{time_pretransfer}s\n
          time_redirect:  %{time_redirect}s\n
     time_starttransfer:  %{time_starttransfer}s\n
                        ----------\n
             time_total:  %{time_total}s\n
    
  2. 요청을하다:

    curl -w "@curl-format.txt" -o /dev/null -s "http://wordpress.com/"
    

    또는 Windows에서는 ...

    curl -w "@curl-format.txt" -o NUL -s "http://wordpress.com/"
    


이것이하는 일 :

-w "@curl-format.txt"cURL에 형식 파일을 사용
-o /dev/null하도록 요청하여 요청 출력을 / dev / n으로 리디렉션합니다.
-s cull에 진행 미터를 표시하지 않도록 지시합니다
"http://wordpress.com/" 가 요청한 URL임을 . URL에 "&"쿼리 문자열 매개 변수가있는 경우 특히 따옴표를 사용하십시오.


그리고 여기에 당신이 얻는 것이 있습니다 :

   time_namelookup:  0.001s
      time_connect:  0.037s
   time_appconnect:  0.000s
  time_pretransfer:  0.037s
     time_redirect:  0.000s
time_starttransfer:  0.092s
                   ----------
        time_total:  0.164s


Linux / Mac 바로 가기 만들기 (별칭)

alias curltime="curl -w \"@$HOME/.curl-format.txt\" -o NUL -s "

그럼 당신은 단순히 전화 할 수 있습니다 ...

curltime wordpress.org

해설자 Pete Doyle에게 감사합니다!


Linux / Mac 독립형 스크립트 만들기

이 스크립트에는 형식을 포함하기 위해 별도의 .txt 파일이 필요하지 않습니다.

실행 파일 어딘가에 새로운 파일, curltime을 만들고 다음에 붙여 넣습니다.

#!/bin/bash

curl -w @- -o /dev/null -s "$@" <<'EOF'
    time_namelookup:  %{time_namelookup}\n
       time_connect:  %{time_connect}\n
    time_appconnect:  %{time_appconnect}\n
   time_pretransfer:  %{time_pretransfer}\n
      time_redirect:  %{time_redirect}\n
 time_starttransfer:  %{time_starttransfer}\n
                    ----------\n
         time_total:  %{time_total}\n
EOF

별명과 같은 방식으로 호출하십시오.

curltime wordpress.org


Windows 바로 가기 만들기 (BAT 파일)

CURLTIME.BAT (curl.exe와 같은 폴더에)에이 명령을 넣습니다.

curl -w "@%~dp0curl-format.txt" -o NUL -s %*

그럼 당신은 단순히 전화 할 수 있습니다 ...

curltime wordpress.org

26
멋진 답변입니다. 감사합니다. 내가해야 할 한 가지는 \n텍스트 파일에서 줄
Jason Kim

2
Windows BAT 파일에서는 첫 번째 매개 변수 만 보내고 모든 매개 변수를 전달하고 명령 자체를 에코하지 않으려면이 매개 변수로 변경하십시오. @curl -w "@%~dp0curl-format.txt" -o NUL -s %*Great answer
padilo

감사합니다 @udoh, 나는 그것을 포함하도록 답변을 업데이트했습니다.
Simon East

훌륭한 답변. 컬이 요청을 시작한 현재 날짜 + 시간은 어떻게 포함합니까?
Saqib Ali

4
Linux의 경우 도트 파일과 별칭을 만들었으며 잘 작동하는 것 같습니다 alias curltime="curl -w \"@$HOME/.curl-format.txt\" -o NUL -s ". MacOS에서도 작동합니다.
피트 도일

161

답은 다음과 같습니다.

curl -X POST -d @file server:port -w %{time_connect}:%{time_starttransfer}:%{time_total}

에 사용 된 모든 변수 -w는에서 찾을 수 있습니다 man curl.


19
사용자 경험에 새로운 줄을 추가하는 것이 좋습니다."\n%{time_connect}:%{time_starttransfer}:%{time_total}\n"

1
나를 위해 그것은 따옴표없이 작동하지 않았습니다. / h / a / c / haproxy 형식을 지정하면서 따옴표를 추가하는 것이 좋습니다. # ❯❯❯ curl -w "% {time_total} \ n" google.com -o / dev / null -s 0.055
Geek

@Geek 일반적으로 자동 모드 ( -sS) 에서 작동 할 때 오류를 표시하는 것이 좋습니다 .
x-yuri

138

옵션 1. 측정하려면 total time:

curl -o /dev/null -s -w 'Total: %{time_total}s\n'  https://www.google.com

샘플 출력 :

여기에 이미지 설명을 입력하십시오

옵션 2. 얻으려면 time to establish connection, TTFB: time to first byte그리고 total time:

curl -o /dev/null -s -w 'Establish Connection: %{time_connect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n'  https://www.google.com

샘플 출력 :

여기에 이미지 설명을 입력하십시오

참고 : curl로 응답 시간 얻기


53

다른 답변에 따라 .bashrc 등에 추가 할 수있는 바로 가기 :

function perf {
  curl -o /dev/null -s -w "%{time_connect} + %{time_starttransfer} = %{time_total}\n" "$1"
}

용법:

> perf stackoverflow.com
0.521 + 0.686 = 1.290

5
측정 된 시간 동안 다운로드 된 바이트 수를 표시하는 변형을 사용합니다.curl -o /dev/null -s -w "time_total: %{time_total} sec\nsize_download: %{size_download} bytes\n" https://www.google.com
jambroseclarke

39

다음은 시몬의 대답에서 영감을 얻은 것입니다. 자체 포함되어 있으며 (별도의 형식 파일이 필요하지 않음) 포함하기에 .bashrc좋습니다.

curl_time() {
    curl -so /dev/null -w "\
   namelookup:  %{time_namelookup}s\n\
      connect:  %{time_connect}s\n\
   appconnect:  %{time_appconnect}s\n\
  pretransfer:  %{time_pretransfer}s\n\
     redirect:  %{time_redirect}s\n\
starttransfer:  %{time_starttransfer}s\n\
-------------------------\n\
        total:  %{time_total}s\n" "$@"
}

또한, 그냥 통과하기 curl때문에 일반적으로 취하는 모든 인수와 함께 작동해야합니다 "$@". 예를 들어 다음을 수행 할 수 있습니다.

curl_time -X POST -H "Content-Type: application/json" -d '{"key": "val"}' https://postman-echo.com/post

산출:

   namelookup:  0,125000s
      connect:  0,250000s
   appconnect:  0,609000s
  pretransfer:  0,609000s
     redirect:  0,000000s
starttransfer:  0,719000s
-------------------------
        total:  0,719000s

34

대기 시간을 분석하거나 요약하려면 아파치 벤치를 사용해보십시오.

ab -n [number of samples] [url]

예를 들면 다음과 같습니다.

ab -n 100 http://www.google.com/

다음과 같이 표시됩니다.

This is ApacheBench, Version 2.3 <$Revision: 1757674 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.google.com (be patient).....done


Server Software:        gws
Server Hostname:        www.google.com
Server Port:            80

Document Path:          /
Document Length:        12419 bytes

Concurrency Level:      1
Time taken for tests:   10.700 seconds
Complete requests:      100
Failed requests:        97
   (Connect: 0, Receive: 0, Length: 97, Exceptions: 0)
Total transferred:      1331107 bytes
HTML transferred:       1268293 bytes
Requests per second:    9.35 [#/sec] (mean)
Time per request:       107.004 [ms] (mean)
Time per request:       107.004 [ms] (mean, across all concurrent requests)
Transfer rate:          121.48 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       20   22   0.8     22      26
Processing:    59   85 108.7     68     911
Waiting:       59   85 108.7     67     910
Total:         80  107 108.8     90     932

Percentage of the requests served within a certain time (ms)
  50%     90
  66%     91
  75%     93
  80%     95
  90%    105
  95%    111
  98%    773
  99%    932
 100%    932 (longest request)

1
다른 답변보다 훨씬 간단합니다. 이 명령을 완전히 잊어 버렸습니다!
FacePalm

이것은 환상적인 답변입니다. 그리고 예 를 들어 헤더 ab와 같이 많은 동일한 플래그를 받아들 입니다. 이 명령을 사용하여 타사 API의 응답 시간을 벤치마킹했습니다 (권한 부여 헤더에 베어러 토큰 제공). 훌륭하게 일했습니다. curl-H
tsamb

21

다른 방법은 다음 ~/.curlrc과 같이 구성하는 것입니다

-w "\n\n==== cURL measurements stats ====\ntotal: %{time_total} seconds \nsize: %{size_download} bytes \ndnslookup: %{time_namelookup} seconds \nconnect: %{time_connect} seconds \nappconnect: %{time_appconnect} seconds \nredirect: %{time_redirect} seconds \npretransfer: %{time_pretransfer} seconds \nstarttransfer: %{time_starttransfer} seconds \ndownloadspeed: %{speed_download} byte/sec \nuploadspeed: %{speed_upload} byte/sec \n\n"

따라서 출력 curl

❯❯ curl -I https://google.com
HTTP/2 301
location: https://www.google.com/
content-type: text/html; charset=UTF-8
date: Mon, 04 Mar 2019 08:02:43 GMT
expires: Wed, 03 Apr 2019 08:02:43 GMT
cache-control: public, max-age=2592000
server: gws
content-length: 220
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
alt-svc: quic=":443"; ma=2592000; v="44,43,39"



==== cURL measurements stats ====
total: 0.211117 seconds
size: 0 bytes
dnslookup: 0.067179 seconds
connect: 0.098817 seconds
appconnect: 0.176232 seconds
redirect: 0.000000 seconds
pretransfer: 0.176438 seconds
starttransfer: 0.209634 seconds
downloadspeed: 0.000 byte/sec
uploadspeed: 0.000 byte/sec

그것에 대해 더 자세한 문서에 대한 참조를 보여 주시겠습니까?
Trần Đức Tâm


10

Hey는 Apache Bench보다 낫고 SSL 관련 문제가 적습니다.

./hey https://google.com -more
Summary:
  Total:    3.0960 secs
  Slowest:  1.6052 secs
  Fastest:  0.4063 secs
  Average:  0.6773 secs
  Requests/sec: 64.5992

Response time histogram:
  0.406 [1] |
  0.526 [142]   |∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎∎
  0.646 [1] |
  0.766 [6] |∎∎
  0.886 [0] |
  1.006 [0] |
  1.126 [0] |
  1.246 [12]    |∎∎∎
  1.365 [32]    |∎∎∎∎∎∎∎∎∎
  1.485 [5] |∎
  1.605 [1] |

Latency distribution:
  10% in 0.4265 secs
  25% in 0.4505 secs
  50% in 0.4838 secs
  75% in 1.2181 secs
  90% in 1.2869 secs
  95% in 1.3384 secs
  99% in 1.4085 secs

Details (average, fastest, slowest):
  DNS+dialup:    0.1150 secs, 0.0000 secs, 0.4849 secs
  DNS-lookup:    0.0032 secs, 0.0000 secs, 0.0319 secs
  req write:     0.0001 secs, 0.0000 secs, 0.0007 secs
  resp wait:     0.2068 secs, 0.1690 secs, 0.4906 secs
  resp read:     0.0117 secs, 0.0011 secs, 0.2375 secs

Status code distribution:
  [200] 200 responses

참고 문헌


9

명령 행 측면 에서 가장 간단한 다른 옵션 은 내장 --trace-time옵션을 추가하는 것입니다.

curl -X POST -d @file server:port --trace-time

기술적으로 OP가 요청한 다양한 단계의 타이밍을 출력하지는 않지만 아래 그림과 같이 요청의 모든 단계에 대한 타임 스탬프를 표시합니다. 이를 사용하면 각 단계가 얼마나 오래 걸 렸는지 계산할 수 있습니다.

$ curl https://www.google.com --trace-time -v -o /dev/null
13:29:11.148734 * Rebuilt URL to: https://www.google.com/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     013:29:11.149958 *   Trying 172.217.20.36...
13:29:11.149993 * TCP_NODELAY set
13:29:11.163177 * Connected to www.google.com (172.217.20.36) port 443 (#0)
13:29:11.164768 * ALPN, offering h2
13:29:11.164804 * ALPN, offering http/1.1
13:29:11.164833 * successfully set certificate verify locations:
13:29:11.164863 *   CAfile: none
  CApath: /etc/ssl/certs
13:29:11.165046 } [5 bytes data]
13:29:11.165099 * (304) (OUT), TLS handshake, Client hello (1):
13:29:11.165128 } [512 bytes data]
13:29:11.189518 * (304) (IN), TLS handshake, Server hello (2):
13:29:11.189537 { [100 bytes data]
13:29:11.189628 * TLSv1.2 (IN), TLS handshake, Certificate (11):
13:29:11.189658 { [2104 bytes data]
13:29:11.190243 * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
13:29:11.190277 { [115 bytes data]
13:29:11.190507 * TLSv1.2 (IN), TLS handshake, Server finished (14):
13:29:11.190539 { [4 bytes data]
13:29:11.190770 * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
13:29:11.190797 } [37 bytes data]
13:29:11.190890 * TLSv1.2 (OUT), TLS change cipher, Client hello (1):
13:29:11.190915 } [1 bytes data]
13:29:11.191023 * TLSv1.2 (OUT), TLS handshake, Finished (20):
13:29:11.191053 } [16 bytes data]
13:29:11.204324 * TLSv1.2 (IN), TLS handshake, Finished (20):
13:29:11.204358 { [16 bytes data]
13:29:11.204417 * SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305
13:29:11.204451 * ALPN, server accepted to use h2
13:29:11.204483 * Server certificate:
13:29:11.204520 *  subject: C=US; ST=California; L=Mountain View; O=Google LLC; CN=www.google.com
13:29:11.204555 *  start date: Oct  2 07:29:00 2018 GMT
13:29:11.204585 *  expire date: Dec 25 07:29:00 2018 GMT
13:29:11.204623 *  subjectAltName: host "www.google.com" matched cert's "www.google.com"
13:29:11.204663 *  issuer: C=US; O=Google Trust Services; CN=Google Internet Authority G3
13:29:11.204701 *  SSL certificate verify ok.
13:29:11.204754 * Using HTTP2, server supports multi-use
13:29:11.204795 * Connection state changed (HTTP/2 confirmed)
13:29:11.204840 * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
13:29:11.204881 } [5 bytes data]
13:29:11.204983 * Using Stream ID: 1 (easy handle 0x55846ef24520)
13:29:11.205034 } [5 bytes data]
13:29:11.205104 > GET / HTTP/2
13:29:11.205104 > Host: www.google.com
13:29:11.205104 > User-Agent: curl/7.61.0
13:29:11.205104 > Accept: */*
13:29:11.205104 > 
13:29:11.218116 { [5 bytes data]
13:29:11.218173 * Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
13:29:11.218211 } [5 bytes data]
13:29:11.251936 < HTTP/2 200 
13:29:11.251962 < date: Fri, 19 Oct 2018 10:29:11 GMT
13:29:11.251998 < expires: -1
13:29:11.252046 < cache-control: private, max-age=0
13:29:11.252085 < content-type: text/html; charset=ISO-8859-1
13:29:11.252119 < p3p: CP="This is not a P3P policy! See g.co/p3phelp for more info."
13:29:11.252160 < server: gws
13:29:11.252198 < x-xss-protection: 1; mode=block
13:29:11.252228 < x-frame-options: SAMEORIGIN
13:29:11.252262 < set-cookie: 1P_JAR=2018-10-19-10; expires=Sun, 18-Nov-2018 10:29:11 GMT; path=/; domain=.google.com
13:29:11.252297 < set-cookie: NID=141=pzXxp1jrJmLwFVl9bLMPFdGCtG8ySQKxB2rlDWgerrKJeXxfdmB1HhJ1UXzX-OaFQcnR1A9LKYxi__PWMigjMBQHmI3xkU53LI_TsYRbkMNJNdxs-caQQ7fEcDGE694S; expires=Sat, 20-Apr-2019 10:29:11 GMT; path=/; domain=.google.com; HttpOnly
13:29:11.252336 < alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
13:29:11.252368 < accept-ranges: none
13:29:11.252408 < vary: Accept-Encoding
13:29:11.252438 < 
13:29:11.252473 { [5 bytes data]
100 12215    0 12215    0     0   112k      0 --:--:-- --:--:-- --:--:--  112k
13:29:11.255674 * Connection #0 to host www.google.com left intact

이것은 실제로 사람들이 찾고있는 대부분의 유스 케이스에 맞는 훌륭한 답변입니다. 다른 답변은 철저하고 심층적 인 솔루션에는 유용하지만 왕복 시간을 빠르게 확인하는 데 좋습니다.
Chris Vandevelde

감사합니다 @ChrisVandevelde. 예, 나는 이와 같은 "뭔가"가 있다는 것을 알고 있었고 (이전에이 매개 변수를 사용 했음)이 SO 포스트로가는 길을 찾아보다 복잡한 형태를 찾았지만 다른 방법이 있다는 느낌이 들었습니다. . :) 당신이 말했듯이, 그것은 단순함에있어서 깔끔하고 때로는 더 간단한 사용 사례에 충분합니다.
Per Lundberg



4

여기에 사용할 수있는 문자열이 있으며 지원하는 -w모든 옵션이 포함되어 있습니다 curl -w.

{"contentType":"%{content_type}","filenameEffective":"%{filename_effective}","ftpEntryPath":"%{ftp_entry_path}","httpCode":"%{http_code}","httpConnect":"%{http_connect}","httpVersion":"%{http_version}","localIp":"%{local_ip}","localPort":"%{local_port}","numConnects":"%{num_connects}","numRedirects":"%{num_redirects}","proxySslVerifyResult":"%{proxy_ssl_verify_result}","redirectUrl":"%{redirect_url}","remoteIp":"%{remote_ip}","remotePort":"%{remote_port}","scheme":"%{scheme}","size":{"download":"%{size_download}","header":"%{size_header}","request":"%{size_request}","upload":"%{size_upload}"},"speed":{"download":"%{speed_download}","upload":"%{speed_upload}"},"sslVerifyResult":"%{ssl_verify_result}","time":{"appconnect":"%{time_appconnect}","connect":"%{time_connect}","namelookup":"%{time_namelookup}","pretransfer":"%{time_pretransfer}","redirect":"%{time_redirect}","starttransfer":"%{time_starttransfer}","total":"%{time_total}"},"urlEffective":"%{url_effective}"}

JSON을 출력합니다.


Prepending \n은 본문이 개행으로 끝나지 않을 때 타이밍을 분리하는 데 도움이됩니다.curl -w '\n{"contentType":"..."}...
Beni Cherniavsky-Paskin

2

동일한 서버에 반복적으로 충돌하는 Bash one-liner는 다음과 같습니다.

for i in {1..1000}; do curl -s -o /dev/null -w "%{time_total}\n" http://server/get_things; done

0

이것은 여러 줄로 된 출력을 한 줄로 만드는 Simons 답변의 수정 된 버전입니다. 또한 현재 타임 스탬프를 소개하므로 각 출력 라인을 쉽게 따라갈 수 있습니다.

샘플 형식 파일
$ cat time-format.txt
time_namelookup:%{time_namelookup} time_connect:%{time_connect} time_appconnect:%{time_appconnect} time_pretransfer:%{time_pretransfer} time_redirect:%{time_redirect} time_starttransfer:%{time_starttransfer} time_total:%{time_total}\n
예 cmd
$ while [ 1 ];do echo -n "$(date) - " ; curl -w @curl-format.txt -o /dev/null -s https://myapp.mydom.com/v1/endpt-http; sleep 1; done | grep -v time_total:0
결과
Mon Dec 16 17:51:47 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.172 time_pretransfer:0.172 time_redirect:0.000 time_starttransfer:1.666 time_total:1.666
Mon Dec 16 17:51:50 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.175 time_pretransfer:0.175 time_redirect:0.000 time_starttransfer:3.794 time_total:3.795
Mon Dec 16 17:51:55 UTC 2019 - time_namelookup:0.004 time_connect:0.017 time_appconnect:0.175 time_pretransfer:0.175 time_redirect:0.000 time_starttransfer:1.971 time_total:1.971
Mon Dec 16 17:51:58 UTC 2019 - time_namelookup:0.004 time_connect:0.014 time_appconnect:0.173 time_pretransfer:0.173 time_redirect:0.000 time_starttransfer:1.161 time_total:1.161
Mon Dec 16 17:52:00 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.166 time_pretransfer:0.167 time_redirect:0.000 time_starttransfer:1.434 time_total:1.434
Mon Dec 16 17:52:02 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.177 time_pretransfer:0.177 time_redirect:0.000 time_starttransfer:5.119 time_total:5.119
Mon Dec 16 17:52:08 UTC 2019 - time_namelookup:0.004 time_connect:0.014 time_appconnect:0.172 time_pretransfer:0.172 time_redirect:0.000 time_starttransfer:30.185 time_total:30.185
Mon Dec 16 17:52:39 UTC 2019 - time_namelookup:0.004 time_connect:0.014 time_appconnect:0.164 time_pretransfer:0.164 time_redirect:0.000 time_starttransfer:30.175 time_total:30.176
Mon Dec 16 17:54:28 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:3.191 time_pretransfer:3.191 time_redirect:0.000 time_starttransfer:3.212 time_total:3.212
Mon Dec 16 17:56:08 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:1.184 time_pretransfer:1.184 time_redirect:0.000 time_starttransfer:1.215 time_total:1.215
Mon Dec 16 18:00:24 UTC 2019 - time_namelookup:0.004 time_connect:0.015 time_appconnect:0.181 time_pretransfer:0.181 time_redirect:0.000 time_starttransfer:1.267 time_total:1.267

위의 끝점에서 느린 응답을 잡기 위해 위를 사용했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.