Software Development Engineer @ Amazon
reniowood at gmail.com resume
다음과 같은 폼을 전송하려면
<form method="POST">
<input name="title">
<input name="author">
<input type="submit">
</form>
다음 curl 커맨드를 사용한다.
$ curl --http1.0 -d title="The Art of Community" -d author="Jono Bacon" http://localhost:18888
위 요청의 바디는 다음과 같은 형식이 된다.
title=The Art of Community&author=Jono Bacon
브라우저에서는 RFC 1866에서 정한 변환 포맷에 따라 변환이 필요한 문자를 변환한다.
title=The+Art+of+Community&author=Jono+Bacon
curl 커맨드의 -data-urlencode
를 이용하면 RFC 3986의 방법으로 변환한다.
title=The%20Art%20of%20Community&author=Jono%20Bacon
<form action="POST" enctype="multipart/form-data">
</form>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyOYfbccgoID172j7
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyOYfbccgoID172j7
Content-Disposition: form-data; name="title"
xxx
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyOYfbccgoID172j7
Content-Disposition: form-data; name="author"
yyy
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryyOYfbccgoID172j7--
Content-Disposition
헤더를 이용해 각 블록의 내용을 표현한다.x-www-form-urlencoded
와는 달리 multipart/form-data
를 사용하면 항목마다 메타 정보를 추가할 수 있다.-F
옵션을 사용하면 enctype="multipart/form-data"
가 설정된 폼과 같은 형식으로 데이터를 전송한다.<input type="hidden">
태그의 값으로 저장한다.Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
0<=q<=1
)로 우선순위를 나타낸다.406 Not Acceptable
오류를 반환한다.Accept-Language: en-US,en;q=0.8,ko;q=0.6
Accept-Charset: windows-949,utf-8;q=0.7,*;q=0.3
모던 브라우저 중 Accept-Charset
을 요청하는 브라우저는 없다.
응답에는 MIME 타입과 함께 Content-Type
헤더에 문자셋이 담긴다.
HTML 문서 안에 쓸 수도 있다.
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8>
또는
<meta charset="UTF-8">
Accept-Encoding: deflate, gzip
—compressed
옵션을 지정하면 된다.Content-Encoding
헤더를 추가해 압축 방식을 알려주고, Content-Length
헤더에는 압축된 파일 크기를 넣는다.웹사이트의 정보를 브라우저 쪽에 저장하는 작은 파일
서버에서는 Set-Cookie
헤더를 이용해 쿠키값을 보내면, 나중에 클라이언트가 저장해둔 값을 Cookie
헤더에 넣어 요청을 전송한다.
브라우저에서도 자바스크립트를 이용해 쿠키를 읽을 수 있다.
document.cookie;
curl 커맨드에선 -b
옵션 혹은 —cookie
옵션을 사용한다.
Set-Cookie
헤더에 옵션을 추가할 수 있다.Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
Set-Cookie: lang=en-US; Path=/; Domain=example.com
Expires
, Max-Age
: 쿠키의 수명을 결정Domain
: 전송할 대상 서버Path
: 쿠키를 전송할 대상 서버의 경로Secure
: https를 사용할 때만 서버로 쿠키를 전송한다.HttpOnly
: 자바스크립트 엔진으로부터 쿠키를 감춘다.SameSite
: 크롬 브라우저에 추가된 속성으로 같은 출처의 도메인에 전송한다.BASIC 인증은 유저명과 패스워드를 BASE64로 인코딩한 것
Authorization: "Basic [인코딩한 정보]"
가역변환이므로 SSL/TLS 통신을 하지 않으면 로그인 정보가 유출될 수 있다.
curl 커맨드에는 -u
옵션이나 —user
옵션으로 보낸다.
$ curl --http1.0 --base -u username:password http://localhost:18888
Digest 인증은 해시 함수를 이용해 더 강력한 인증 방식이다.
브라우저가 보호된 영역으로 접속하려고 하면 401 Unauthorized
스테이터스 코드와 함께 다음과 같은 헤더를 담아 응답이 돌아온다.
WWW-Authenticate: Digest realm="영역명", nonce="2482509423", algorithm=MD5, qop="auth"
위의 헤더에 주어진 값과 무작위로 생성한 cnonce
를 바탕으로 response
를 구한다.
A1 = 유저명 ":" realm ":" 패스워드
A2 = HTTP 메서드 ":" 콘텐츠 URI
response = MD5(MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2))
nc는 특정 nonce
값을 사용해 전송한 횟수
qop가 없을 때는 생략한다.
클라이언트에서는 cnonce
와 response
값으로 헤더를 만들어 재요청을 보낸다.
Authorization: Digest username="유저명", realm="영역명", nonce="2482509423", uri="/secret.html", algorithm=MD5, qop=auth, nc=0000001, cnonce="12312343", response="2394024324"
서버는 같은 계산을 해 재요청과 동일한 response
가 계산되면 사용자가 인증되었음을 알 수 있다.
유저명과 패스워드를 모두 요청에 포함하지 않고도 서버에서 사용자를 인증 할 수 있게 된다.
curl 커맨드에서는 —digest
옵션과 -u
/—user
옵션을 이용해 Digest 인증을 사용할 수 있다.
프록시는 HTTP 등의 통신을 중계한다.
캐시 기능을 붙이거나 네트워크를 보호하는 방화벽 역할도 할 수 있다.
GET 등의 메서드 다음에 오는 경로명 형식만 바뀐다.
프록시 서버에 인증이 필요한 경우 Proxy-Authenticate
헤더를 사용한다.
중계되는 프록시는 중간의 호스트 IP 주소를 X-Forwarded-For
헤더 혹은 RFC 7239의 Forwarded
헤더에 저장한다.
curl 커맨드에서 프록시를 사용하려면 -x
/—proxy
옵션을 사용한다. 인증용 유저명과 패스워드는 -U
/—proxy-user
옵션을 사용한다.
$ curl --http1.0 -x http://localhost:18888 -U user:pass http://example.com/helloworld
HTTPS 통신의 프록시 지원은 HTTP/1.1의 CONNECT
메서드를 이용한다.
Last-Modified
헤더에 담아 응답에 보낸다.If-Modified-Since
헤더에 넣어 요청한다.200 OK
과 변경된 콘텐츠, 그렇지 않으면 304 Not Modified
응답만을 보낸다.Expires
헤더에는 날짜와 시간이 들어간다.Expires
를 메인 페이지 등에 사용할 때는 주의해야 한다.Pragma: no-cache
를 넣으면 프록시에게 ‘캐시가 있어도 원래 서버에서 가지고 와라’라고 지시한다.
Cache-Control
로 통합되었지만 하위 호환성을 위해 남아있다.Etag
는 파일의 해시 값으로 캐시 여부를 판별한다.ETag
헤더를 보내면, 클라이언트는 추후 요청에 If-None-Match
헤더에 그 값을 넣어 보낸다.ETag
값은 서버에서 자유롭게 만들 수 있다.Cache-Control
로 더 유연한 캐시 제어를 지시할 수 있다.Expires
보다 우선해서 처리된다.no-cache
는 캐시하지 않는 것이 아니라, 매번 접속을 시켜 캐시 유효성을 검증하게 한다. no-store
가 캐시하지 않는다.(private || public) && (max-age || s-maxage || no-cache || no-store)
으로 설정한다.Cache-Control
로 프록시에 지시할 수 있다.
Cache-Control: no-cache
: Pragma: no-cache
와 같다.Cache-Control
로 서버에서 프록시로 지시를 할 수도 있다.Referer
는 사용자가 어느 경로로 웹사이트에 도달했는지 서버가 파악할 수 있도록 서버에 보내는 헤더다.
Referrer-Policy
헤더나 메타 태그 등으로 정책을 설정하거나 Content-Security-Policy
헤더로 보안 설정을 지정할 수 있다.서버 콘텐츠 제공자가 크롤러에 접근 허가 여부를 전하기 위한 프로토콜
다음과 같은 형식으로 읽기를 금지할 이름과 장소를 지정한다.
User-agent: *
Disallow: /cgi-bin/
Disallow: /tmp/
메타 태그로도 지정할 수 있다.
<meta name="robots" content="noindex" />