나는 API를 이용하여 데이터를 수집할 때, 수집 프로세스 작성 전에 Postman에서 간단한 API 테스트를 진행한다.
예를 들면, 요청 파라미터 이외에 필요한 것들이 있는지 확인하거나 응답의 구조를 조금 더 자세히 살피고 어떤 방식으로 데이터를 수집하여 데이터베이스에 적재할지 고민하는 것과 같은 내용이다.
이번에도 먼저 Postman에서 API 테스트를 진행했고, 특이사항을 발견하지 못했기 때문에 그대로 수집 프로세스에 적용했다. 하지만 작성한 수집 프로세스를 테스트하는 과정에서는 오류가 발생했다.
원인은 수집 프로세스에서 요청을 보낼 때, 요청 헤더에 User-Agent 값이 없었다는 점이었다.
요청 헤더에 User-Agent가 없기 때문에 서버에서는 해당 요청을 비정상적인 접근이라고 판단하여 거부한 것이다.
하지만 Postman에서는 별도의 User-Agent를 작성하지 않고도 정상적인 응답을 받을 수 있었다. 그래서 이런 오류가 발생한 이유가 무엇일지 궁금해졌다.

Postman의 Headers를 보면 위와 같은 내용을 확인할 수 있다.
사용자가 추가하지 않더라도 기본적으로 제공하는 헤더 값을 사용하고 있다.
기본적으로 Postman의 User-Agent는 PostmanRuntime/x.y.z라는 값을 사용하며, 이는 서버가 해당 요청이 Postman에서 보냈다는 것을 알 수 있게 한다.
Postman에서는 PostmanRuntime이라는 값을 전달하지만, 수집 프로세스에서는 요청 헤더를 사용하지 않았기 때문에 당연히 User-Agent에 대한 정보가 없으므로 서버 측에서는 클라이언트를 신뢰할 수 없다고 판단하여 오류를 반환한 것이다.
request_header = {
"User-Agent": "Mozilla ... "
}
...
response = session.get(url, headers=request_header)
요청 헤더에 User-Agent를 작성하여 요청과 함께 전달하는 방식으로 해결할 수 있었다.
이번 데이터 수집은 일회성 수집이며, 요청 수가 적었기 때문에 추가적인 구현 없이 요청 헤더만 추가했다.
요청 헤더 추가로 빠른 문제 해결과 데이터 수집을 완료할 수 있었다.
Postman에서 정상 작동한 요청이 거절된다면 요청 헤더의
User-Agent를 살펴보자
간단한 데이터 수집 과정에서 발생한 작은 오류를 해결하면서 Postman과 관련하여 궁금했던 점을 조금 더 알아본 김에 기록하기로 했다.
API 요청 오류 문제를 해결하는 과정을 단순하게 작성했지만, 모든 API가 같은 구성을 가지고 있지 않다.
이번에는 User-Agent 문제임을 어렵지 않게 파악해서 쉽고 빠르게 해결할 수 있었던 것이고, 이번에 사용한 방법이 항상 정답일 수 없다는 것을 알고 있다.
그래서 이번에는 이런 방법으로 해결했다는 점을 잊지 않기 위해 기록한 것도 있다.
그리고 다시 한번, 데이터를 수집하는 과정은 퍼즐 맞추기 같다고 생각했다.