Image.network(url)을 사용해 특정한 url에서 image를 불러올 때 문제가 발생했다.
User-Agent
는 웹 요청을 보낼 때 클라이언트(즉, 브라우저나 애플리케이션)가 서버에 자신을 식별할 목적으로 전달하는 문자열이다. 이 문자열은 요청을 보낸 프로그램의 이름, 버전, 운영 체제 등의 정보를 포함하고 있어, 서버가 요청을 구분하고 최적화된 응답을 제공하는 데 도움을 준다.
예시: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
위의 예시는 Chrome 브라우저에서 보낸 요청임을 나타내는 User-Agent 문자열이다.
Flutter의 Image.network()
위젯을 사용할 때 기본적으로 Dart의 HTTP 클라이언트는 다음과 같은 User-Agent 값을 사용한다:
Dart/<version> (dart:io)
이 기본 User-Agent 값은 서버에 의해 봇이나 스크래퍼로 인식될 수 있으며, 그 결과로 서버는 비정상적인 요청을 차단하기 위해 해당 요청을 차단하여 403 Forbidden
오류를 반환할 수 있다.
특정 요청에 대해서만 User-Agent 값을 브라우저 값으로 설정하여 문제를 해결할 수 있다. 이 방법은 개별 요청에 User-Agent 값을 지정하는 방식으로, 각 이미지 로딩 시 사용할 수 있다.
child: Image.network(
webtoon.thumb,
headers: const {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
},
),
이 코드는 User-Agent를 명시적으로 설정하여 서버가 요청을 정상적인 브라우저 요청으로 인식하도록 한다.
앱 전체에서 모든 네트워크 요청에 대해 User-Agent 값을 설정할 수도 있다. 이를 위해 HttpOverrides
클래스를 사용하여 Flutter 애플리케이션의 전역 HTTP 클라이언트를 오버라이드할 수 있다.
import 'dart:io';
class MyHttpOverrides extends HttpOverrides {
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36';
}
}
void main() {
HttpOverrides.global = MyHttpOverrides();
runApp(const App());
}
이 방법은 앱 내 모든 HTTP 요청이 동일한 User-Agent를 사용하도록 설정하므로, 모든 네트워크 요청에서 User-Agent 문제를 한 번에 해결할 수 있다.
HttpOverrides
는 Flutter의 HTTP 클라이언트 동작을 전역적으로 오버라이드할 수 있는 클래스이다. 이 클래스를 사용하면 앱 내 모든 네트워크 요청에 대해 기본 설정을 변경할 수 있어, User-Agent
와 같은 HTTP 헤더를 쉽게 수정할 수 있다.
HttpOverrides
)을 사용해 개별 요청마다 User-Agent를 설정할 필요가 없으므로 코드의 유지보수성이 향상된다.HttpOverrides
를 사용하면 앱 전체의 네트워크 요청을 한 번에 오버라이드할 수 있으므로, 코드의 유지보수성과 일관성을 높일 수 있다.참고
flutter에서 로컬 또는 전역적으로 User-Agent 설정하는 방법
User-Agent의 기본 개념과 브라우저 별 설정 방법