“서버는 어떻게 요청이 앱에서 왔는지, 웹에서 왔는지 알 수 있을까?”
최근 프로젝트에서 요청을 구분해서 로깅하거나 통계 처리를 하다 보니, 사용자 디바이스 종류(iOS/Android/Web 등)를 서버에서 식별할 필요가 생겼습니다. 이럴 때 핵심적으로 사용하는 게 바로 HTTP 헤더입니다.
HTTP 헤더는 클라이언트와 서버 간의 요청/응답에서 부가 정보를 담는 메타데이터입니다. 모든 HTTP 요청은 헤더와 함께 오고, 이 정보를 기반으로 서버는 다양한 처리를 할 수 있습니다.
GET /hello HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)
Authorization: Bearer eyJhbGciOi...
| 헤더 키 | 설명 |
|---|---|
User-Agent | 브라우저나 앱의 종류 및 OS 정보 |
Authorization | JWT, OAuth 토큰 등 인증 정보 |
Content-Type | 전송 데이터 형식 (예: JSON) |
Accept | 클라이언트가 받을 수 있는 데이터 타입 |
User-Agent로 웹/앱 구분하기User-Agent에는 클라이언트 정보가 포함되어 있어, 간단한 문자열 비교만으로 디바이스 종류를 구분할 수 있습니다.
예:
String ua = request.getHeader("User-Agent");
if (ua.contains("Dart") || ua.contains("PostmanRuntime")) {
return "앱 요청";
} else if (ua.contains("Mozilla") || ua.contains("Chrome") || ua.contains("Safari")) {
return "웹 요청";
}
참고: Flutter에서 Dio로 요청하면
Dart문자열이 포함됩니다.
User-Agent 만으로는 iOS/Android/웹 정도만 구분할 수 있고, 기기 모델명이나 앱 버전은 알 수 없습니다.
이럴 때는 앱에서 커스텀 HTTP 헤더를 만들어서 보내면 됩니다.
final dio = Dio();
dio.options.headers["X-Device-Model"] = "iPhone13,4";
dio.options.headers["X-App-Version"] = "1.2.3";
String model = request.getHeader("X-Device-Model");
String version = request.getHeader("X-App-Version");
이렇게 하면 로그나 통계 시스템에서 앱 버전별 이슈 파악, 기기별 오류 분석도 가능해져 실무에서 매우 유용합니다.
X-Platform-Type, X-App-Version, X-Device-Model 같은 헤더를 포함하세요.0: 앱, 1: 웹, -1: 미분류) 정도는 공통 유틸로 분리해 관리하면 편리합니다.서버는 기본적으로 사용자의 디바이스 정보를 직접 알 수 없습니다.
하지만 HTTP 헤더를 잘 활용하면 요청을 구분하고, 디바이스 특성에 맞게 처리하는 유연한 백엔드 시스템을 만들 수 있습니다.