Search
Duplicate

리얼 월드 HTTP

수업
Network Study
주제
5 more properties

curl

고언어 HTTP/1.1 실습

Keep-Alive

Go언어는 기본적으로 Keep-Alive가 유효하다.

TLS

기본적으로 https:// 표기만 해주어도 TLS 통신이 가능하다.
# RSA 2048 비트 키 생성 openssl genrsa -out ca.key 2048 # 인증서 서명 요청(CSR) 생성 openssl req -new -sha256 -key ca.key -out ca.csr -config openssl.cnf # 인증서 자체의 비밀 키로 서명하여 CA 인증서 생성 openssl x509 -req -days 365 -in ca.csr -sha256 -out ca.crt -CAkey ca.key -CAcreateserial -extfile ./openssl.cnf -extensions CA # 비밀 키 확인 openssl rsa -in ca.key -text # 인증서 서명 요청 확인 (CSR) openssl req -in ca.csr -text # 인증서 확인 openssl x509 -in ca.crt -text
Bash
복사
# RSA 2048 비트 서버 비밀 키 생성 openssl genrsa -out server.key 2048 # 인증서 서명 요청 (CSR) 생성 openssl req -new -nodes -sha256 -key server.key -out server.csr -config openssl.cnf # CA 인증서를 사용하여 서버 인증서 생성 openssl x509 -req -days 365 -in server.csr -sha256 -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -extfile ./openssl.cnf -extensions Server
Bash
복사
genrsa: RSA 암호화 알고리즘을 사용하여 비밀 키를 생성합니다. 여기서 out은 출력 파일명을 지정하며, 2048은 키의 비트 수입니다.
req -new: 새로운 인증서 서명 요청(CSR)을 생성합니다. sha256은 해시 알고리즘으로 SHA-256을 사용합니다.
x509 -req: CSR을 사용하여 인증서를 생성합니다. days는 인증서의 유효 기간을 일 단위로 설정합니다.
rsa, req, x509: 각 명령은 키, CSR, 인증서의 내용을 텍스트 형식으로 출력하여 확인할 수 있습니다.
nodes: (서버 인증서 생성시 사용) 비밀번호 없이 키를 저장합니다.
CAcreateserial: CA 인증서를 사용할 때 필요한 시리얼 번호 파일을 생성합니다.
extfile -extensions: openssl.cnf 설정 파일에서 특정 확장 설정을 사용하여 인증서를 생성합니다. 'CA'와 'Server'는 openssl.cnf 파일에 정의된 확장 섹션입니다.

청크

package main import ( "bufio" "fmt" "io" "log" "net/http" ) func main() { // 서버의 청크 인코딩된 데이터 스트림에 연결 resp, err := http.Get("http://localhost:18888/chunked") if err != nil { log.Fatal(err) } defer resp.Body.Close() // 데이터 스트림 읽기 reader := bufio.NewReader(resp.Body) for { line, err := reader.ReadBytes('\n') if err == io.EOF { break // 데이터 스트림의 끝에 도달했을 때 반복 종료 } fmt.Print(string(line)) // 청크 출력 } }
Go
복사
package main import ( "fmt" "net/http" "time" ) func handlerChunkedResponse(w http.ResponseWriter, r *http.Request) { flusher, ok := w.(http.Flusher) if !ok { panic("expected http.ResponseWriter to be an http.Flusher") } for i := 1; i <= 10; i++ { // 청크 데이터 전송 fmt.Fprintf(w, "Chunk #%d\n", i) flusher.Flush() // 즉시 데이터를 클라이언트에게 전달 time.Sleep(500 * time.Millisecond) // 청크 사이의 지연 시간 } } func main() { http.HandleFunc("/chunked", handlerChunkedResponse) http.ListenAndServe(":18888", nil) }
Go
복사
1.
서버 실행: 서버 코드를 server.go로 저장하고, go run server.go 명령을 사용해 실행합니다.
2.
클라이언트 실행: 클라이언트 코드를 client.go로 저장하고, go run client.go 명령을 사용해 실행합니다. 서버가 실행 중인 상태에서 클라이언트를 실행하면, 서버로부터 청크 인코딩된 데이터를 받아 콘솔에 출력할 것입니다.
이렇게 청크 인코딩을 사용하는 방식의 목적은 다음과 같습니다:
1.
데이터 스트리밍: 클라이언트가 서버로부터 전체 데이터를 한 번에 받기 전에도 일부 데이터를 수신하여 처리할 수 있습니다. 이는 특히 비디오나 오디오 스트리밍, 실시간 데이터 처리와 같은 응용에서 유용합니다.
2.
대용량 데이터 처리: 전체 데이터를 메모리에 한 번에 로드하지 않고, 점진적으로 처리할 수 있어 시스템 리소스 사용을 최적화할 수 있습니다.
3.
네트워크 효율성: 네트워크 상황이 좋지 않거나 변동이 클 경우 청크 단위로 데이터를 보내면 네트워크 연결 중단 등의 문제에 더 유연하게 대처할 수 있습니다.