HTTP 요청의 투명한 수정

GolangBeginner
지금 연습하기

소개

이 프로젝트에서는 Go 의 http.RoundTripper 인터페이스를 사용하여 HTTP 요청을 투명하게 수정하는 방법을 배우게 됩니다. 요청 본문의 MD5 해시를 계산하고 "X-Md5" 필드로 요청 헤더에 추가하는 사용자 지정 HTTP 전송을 생성합니다.

👀 미리보기

$ /usr/local/go/bin/go test
PASS
ok      md5transport    0.004s

🎯 과제

이 프로젝트에서는 다음을 배우게 됩니다.

  • HTTP 요청 및 응답에 대한 사용자 지정 작업을 수행하기 위해 http.RoundTripper 인터페이스를 캡슐화하는 방법.
  • 요청 본문의 MD5 해시를 계산하고 요청 헤더에 추가하는 방법.
  • MD5 해시를 계산한 후 원래 요청 상태를 유지하기 위해 요청 본문을 재설정하는 방법.

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • Go 에서 HTTP 요청의 투명한 수정 개념을 이해합니다.
  • 요청 및 응답에 다양한 작업을 수행할 수 있는 사용자 지정 HTTP 전송 계층을 구현합니다.
  • 인증, 로깅 또는 요청/응답 조작과 같은 추가 기능을 통해 자체 애플리케이션을 향상시키기 위해 지식을 적용합니다.

MD5 계산 및 헤더 수정 구현

이 단계에서는 요청 본문의 MD5 를 계산하고, 16 진수로 변환하여 X-Md5라는 이름으로 요청 헤더에 추가하는 간단한 데이터 검증 기능을 구현하는 방법을 배우게 됩니다.

  1. 편집기에서 md5_transport.go 파일을 엽니다.
  2. import에 필요한 내용을 추가합니다.
import (
 "bytes"
 "crypto/md5"
 "encoding/hex"
 "io"
 "net/http"
)
  1. Transport 구조체의 RoundTrip 함수에서 요청 본문의 MD5 를 계산하고 요청 헤더에 설정하는 다음 코드를 추가합니다.
// Complete the code
// if reqeust body is not nil, calculate md5 and set to header
if req.Body != nil {
    body, err := io.ReadAll(req.Body)
    if err != nil {
        // If read body error, return the original request.
        // dont't interrupt the request
        return t.RoundTripper.RoundTrip(req)
    }

    // Calculate md5
    md5Hash := md5.Sum(body)
    md5HashStr := hex.EncodeToString(md5Hash[:])

    // Set md5 to header
    req.Header.Set("X-Md5", md5HashStr)

    // Reset request body
    req.Body = io.NopCloser(bytes.NewReader(body))
}

이 코드는 먼저 요청 본문이 nil 이 아닌지 확인합니다. 그렇지 않은 경우, io.ReadAll을 사용하여 전체 본문을 읽고, md5 패키지를 사용하여 MD5 해시를 계산하고, 해시를 16 진수 문자열로 변환합니다. 그런 다음, 계산된 MD5 값으로 "X-Md5" 헤더를 설정합니다. 마지막으로, bytes.NewReader를 사용하여 요청 본문을 원래 상태로 재설정합니다.

  1. 코드를 추가한 후 md5_transport.go 파일을 저장합니다.

구현 테스트

구현을 테스트하려면 다음 단계를 따르세요.

  1. 편집기에서 터미널을 엽니다.

  2. 프로젝트 디렉토리로 이동합니다.

    cd /home/labex/project
    
  3. 테스트를 실행합니다.

    /usr/local/go/bin/go test
    

코드가 올바르게 구현되었다면 다음과 같은 출력을 볼 수 있습니다.

PASS
ok      md5transport    0.004s

이는 테스트가 통과되었으며, MD5 계산 및 헤더 수정 구현이 예상대로 작동하고 있음을 나타냅니다.

HTTP 요청 투명 수정 이해

Go 에서는 종종 http.Client를 사용하여 네트워크 요청을 수행합니다. http.Client는 내부적으로 http.Request를 생성한 다음 http.RoundTripper.RoundTrip을 사용하여 실제 요청을 수행합니다. 실제 데이터 전송 작업은 RoundTrip 내부에서 수행됩니다.

http.RoundTripper 인터페이스를 캡슐화함으로써, 인증, 통계, 감사 로깅, 요청 수정 등 다양한 작업을 사용자가 알 수 없도록 투명하게 수행할 수 있습니다.

이 챌린지에서는 요청 본문의 MD5 를 계산하여 요청 헤더에 추가하는 간단한 데이터 검증 기능을 구현했습니다. 이는 http.RoundTripper 인터페이스를 사용하여 HTTP 요청을 투명하게 수정하는 방법의 한 예시입니다.

모듈 라이브러리를 설계하거나 다른 사람의 컴포넌트를 사용할 때, 이 기술을 사용하여 추가 기능을 추가하거나 애플리케이션의 동작을 투명하게 수정하는 방법을 생각해 볼 수 있습니다.

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습