2021-02-01-TIL
2021-02-01-TIL
브라우저가 페이지를 받아오기까지
www.disney.com -> get ip address:10.5.3.7 -> http request -> http response
주소창에 도메인을 입력하면 먼저 DNS 조회로 도메인을 IP 주소로 바꾸고, 그 주소의 서버와 TCP 연결을 맺은 뒤 HTTP 요청을 보내고 응답을 받는다. HTTP 메시지는 시작줄(요청이면 메서드, 경로, 버전), 헤더들, 빈 줄, 본문 순서로 구성된다. 헤더는 이름: 값 형태로 요청과 응답의 부가 정보를 담는다. Host(요청 대상 호스트), Content-Type(본문 형식), Content-Length(본문 바이트 수) 등이 기본이다.
- https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers
월드와이드웹(WWW)은 1989년 CERN의 팀 버너스리가 문서들을 하이퍼링크로 잇는 정보 공유 시스템으로 제안한 데서 시작했다. 아래 글은 그 출발을 다룬 연재다.
- https://joone.net/2021/01/02/37-%EC%9B%94%EB%93%9C%EC%99%80%EC%9D%B4%EB%93%9C%EC%9B%B9www%EC%9D%98-%EC%8B%9C%EC%9E%91-1/
Permission error
macOS에서 Wireshark로 Wi-Fi 인터페이스(en0)의 패킷을 캡처하려 할 때 “You don’t have permission to capture on that device” 오류가 나는 경우다. 패킷 캡처는 /dev/bpf* 장치(BPF, Berkeley Packet Filter)를 읽어야 하는데 일반 사용자에게 권한이 없어서 생긴다. 링크의 글은 sudo chown 사용자명 /dev/bpf*로 장치 소유자를 바꾸는 방법을 소개한다.
https://hello-gg.tistory.com/28
HTTP Request method
HTTP 메서드는 요청의 의도를 나타낸다. GET은 리소스 조회, POST는 데이터 제출이나 생성, PUT은 대상 리소스 전체 교체, PATCH는 부분 수정, DELETE는 삭제, HEAD는 본문 없이 헤더만 조회한다. MDN은 메서드를 안전한(safe) 메서드와 멱등(idempotent) 메서드로 구분해 설명한다. GET, HEAD는 서버 상태를 바꾸지 않아 안전하고, PUT, DELETE는 같은 요청을 여러 번 보내도 결과가 같아 멱등이지만, POST는 둘 다 아니다.
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
오늘의 책 추천
- 유닉스의 탄생
브라이언 커니핸이 벨 연구소에서 유닉스가 만들어지던 과정과 사람들을 회고한 책이다.
Project Structure
1
2
3
4
5
6
7
8
9
10
11
12
└── HttpProcessor
├── HttpProcessor.iml
├── domains.txt
├── out
│ └── production
│ └── HttpProcessor
│ ├── HttpRequestTest.class
│ └── HttpRequester.class
├── requestHeader.txt
└── src
├── HttpRequestTest.java
└── HttpRequester.java
Mission1 - HTTP Request
Mission2 - HTTP Response
Done
- Mission1 구현 및 테스트
- Mission2 HTTP Response 출력까지
ToDo
body의 data를 Content-Length만큼 잘라서 담아야한다. (현재는 header와 body의 구분없이 받아서 출력한다.)
구매하고 한번도 본적 없던 김영한님의 강의를 한번 보고 정리해봐야겠다.
헤더와 본문을 나누는 기준은 HTTP 명세에 정해져 있다. 헤더는 빈 줄(\r\n\r\n)에서 끝나고, 그 뒤의 본문 길이는 Content-Length 헤더 값(바이트 수)만큼이다. 그래서 응답을 줄 단위로 읽다가 빈 줄을 만나면 헤더 파싱을 멈추고, Content-Length만큼 바이트를 더 읽으면 된다. 문자 단위가 아니라 바이트 단위라는 점, 그리고 Transfer-Encoding: chunked 응답에는 Content-Length가 없다는 점을 함께 처리해야 한다.
How to send a raw HTTP request vis Java
HTTP는 TCP 위의 텍스트 프로토콜이므로, Socket으로 서버의 80번 포트에 연결해 요청 메시지를 직접 써 보내도 된다. 첫 번째 글이 이 방식이다. 요청 줄과 헤더는 CRLF(\r\n)로 끝나야 하고, HTTP/1.1에서는 Host 헤더가 필수다.
1
2
3
4
5
6
7
try (Socket socket = new Socket("example.com", 80)) {
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.print("GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n");
out.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
in.lines().forEach(System.out::println);
}
실무 코드에서는 직접 소켓을 다루기보다 HttpURLConnection이나 Java 11의 HttpClient를 쓴다. Baeldung 글은 HttpURLConnection으로 메서드, 헤더, 파라미터를 설정하고 응답 코드와 본문을 읽는 방법을 정리한다.
https://code.joejag.com/2012/how-to-send-a-raw-http-request-via-java.html
https://www.baeldung.com/java-http-request
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers





댓글
아직 댓글이 없습니다