개발
php 에이전트 검사 라이브러리 (jenssegers/agent)
23 views as of .
php user-agent 값 얻기
php 환경에서 유저의 에이전트를 확인하는 방법은 일반적으로 요청 헤더를 분석해 판단하는 방법이 있다.
통상적으로 서버 헤더에서 가져온 유저 에이전트 값을 기준으로 이를 파싱해 모바일 접근인지 피시접근인지 봇 접근인지도 판단할 수 있는 기본 코드는 아래와 같다.
<?php
// $_SERVER['HTTP_USER_AGENT']를 통해 User-Agent 값을 얻습니다.
// 값이 없을 경우 'Unknown user agent'로 기본 설정합니다.
$userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Unknown user agent';
// 출력할 때는 보안을 위해 htmlspecialchars()로 이스케이프 처리합니다.
echo "User Agent: " . htmlspecialchars($userAgent, ENT_QUOTES, 'UTF-8');
Copy
더 간단하게 표현한다면 아래와 같이도 써볼 수있다.
<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? 'Unknown user agent';
echo "User Agent: " . htmlspecialchars($userAgent, ENT_QUOTES, 'UTF-8');
Copy
라라벨의 경우에는 더 단순하게 이 값을 아래와 같이 빼올 수 있다.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserAgentController extends Controller
{
public function show(Request $request)
{
// User-Agent 헤더 값 가져오기
$userAgent = $request->header('User-Agent');
// 가져온 값을 뷰로 전달
return view('useragent', compact('userAgent'));
}
}
Copy
이제 여기에서 정규식을 사용해 유저 에이전트 값에서 문자열을 추출해 사용자의 에이전트가 뭔지 유추할 수 있다.
$userAgent = $request->header('User-Agent');
$isMobile = false;
// 간단한 정규표현식 예시 (더 세밀한 검사가 필요할 수 있음)
if (preg_match('/(android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini)/i', $userAgent)) {
$isMobile = true;
}
Copy
문제는 이런 정규식 표현이 익숙하지 않거나 미리 정의된 정확한 값을 쓰고 싶을때가 있을것이다.
이런 경우를 위해 뭐 괜찮은게 없나 알아봤더니 이런 유저 에이전트를 분석해 쉽게 함수로 정의해둔 php 라이브러리가 있다는걸 알게되었다.
jenssegers/agent
GitHub - jenssegers/agent: 👮 A PHP desktop/mobile user agent parser with support for Laravel, based on Mobiledetect
👮 A PHP desktop/mobile user agent parser with support for Laravel, based on Mobiledetect - jenssegers/agent
https://github.com/jenssegers/agent
위 깃허브 프로젝트 들어가면 에이전트를 분석해 사용할 수 있는 라이브러리 패키지를 사용할 수 있다.
php 패키지 관리를 컴포저로 한다면 아래와 같이 쉽게 위 프로젝트를 현재 프로젝트에 추가해볼 수 있다.
composer require jenssegers/agent
Copy
그리고 필요한 컨트롤러에서 아래와 같이 응용해 사용할 수 있다.
use Jenssegers\Agent\Agent;
public function index(Request $request)
{
$agent = new Agent();
$agent->setUserAgent($request->header('User-Agent'));
$isMobile = $agent->isMobile();
return view('your-view', compact('isMobile'));
}
Copy
여기서 에이전트가 가지고 있는 몇가지 옵션중에 그나마 쓸만한걸 서술해보자면 아래와 같다.
사용자 디바이스 조건
모바일 조건
// 모바일 기기 (휴대폰, 스마트폰, 태블릿 등)
$agent->isMobile();
// 태블릿 기기만
$agent->isTablet();
// 스마트폰 기기만 (태블릿 제외)
if($agent->isMobile() && !$agent->isTablet()) { }
Copy
데스크톱 조건
$agent->isDesktop();
// isMobile(), isTablet(), isRobot()과는 절대 겹치는 조건이 없음
Copy
봇 조건
// 크롤러 봇 등
$agent->isRobot();
// 봇 이름 추출
$robot = $agent->robot();
Copy
OS 조건
// 각종 운영체제 기록 조건 검증
$agent->is('Windows');
$agent->is('Firefox');
$agent->is('iPhone');
$agent->is('OS X');
// 미리 정의된 운영체제 조건 함수
$agent->isAndroidOS();
$agent->isNexus();
$agent->isSafari();
// 운영체제(플랫폼)명 추출
$platform = $agent->platform();
Copy
정규식 조건
// 직접 에이전트의 특정 문자열 정규식 체크가 필요할 때
$agent->match('regexp');
Copy
많이 쓰이는 조건식은 위 정도일것이다.
더많은 조건 메소드를 얻고 싶다면 깃허브 페이지를 방문해보면 될것이다.
라라벨 파사드로 등록
라라벨에서 위 패키지를 더 쉽게 쓰기위해서는 파사드로 등록해두면 매우 편할것이다.
config/app.php
파일을 열어 aliases
배열 맨 아래에 아래와 같이 해당 패키지 클래스를 추가해주자'aliases' => [
// 기타 alias들 ...
'Agent' => Jenssegers\Agent\Facades\Agent::class,
],
Copy
그리고 이 설정을 적용시키기위해서 터미널에 가서 설정값을 재 캐싱해준다.
php artisan config:cache
Copy
그러고나면 이제 파사드 객체를 이용해 컨트롤러 단이든 뷰단이든 어디서든 유저 에이전트 값을 적절히 분리해서 사용해볼 수 있을 것이다.
{{-- resources/views/your-view.blade.php --}}
@if (Agent::isMobile())
{{-- 모바일 접근: 반응형 광고 --}}
@include('ads.responsive')
@else
{{-- 데스크탑 접근: 고정형 광고 --}}
@include('ads.fixed')
@endif
Copy
주의 사항
어디까지나 헤더에 있는 유저 에이전트 값을 기준으로 분석하므로 실제 랜더링된 데이터가 아니라고 생각해야한다.
특히나 최적화를 위해서 페이지 캐싱을 하는 경우에는 피시용으로 캐싱된 페이지가 모바일에도 쓰일 수 있으므로 위 코드를 작성하고 정말 문제가 없는지 체크를 하고 필요에 맞게 유저 에이전트 값을 기준으로 별도의 캐시 전략을 구상해야할 것이다.
나도 처음에는 간단히 앞단에서 스크립트 처리없이 유저 에이전트의 디바이스 값 기준으로 모바일뷰, 데스크탑뷰로 화면을 랜더링하려했는데, 이러면 에이전트 데스크탑 뷰기준으로 페이지가 캐싱되어버리고 나중에 에이전트 모바일이 와도 기존에 저장된 데스크탑 뷰의 내용이 보여져서 뜻하지않은 문제가 발생한다고한다.
이를 막기위해서는 캐시를 저장할때 Vary 옵션을 통해 유저 에이전트에 따른 페이지 캐싱 전략을 따로 설계해서 써야한다고 한다.
디바이스에 따른 페이지 랜더링은 가능하면 실제 랜더링된 값을 바탕으로 작업이 이루어지는 자바 스크립트나 앞단 프레임워크로 제어하는게 좋은거 같다...
#php #Laravel
0
개의 댓글
개발 카테고리의 다른 글
02/05
구글 검색 상위 순위를 위한 리치 스니펫 작성
검색엔진을 위해서 우리는 각종 SEO에 필요한 메타정보를 페이지 상단에 배치해서 사용한다.대표적으로 SNS 공유를 위한 오픈그...
02/03
php 이미지 검열 구현 2 (픽셀 모자이크)
php 이미지 검열 구현 (가우시안 블러) | 에루라보우리가 웹사이트를 운영하다가보면 필요에 따라 이미지를 검열할 방법이 필요...
02/03
딥시크(DeepSeek) R1 모델 로컬 실행 후기
요즘 딥시크라고 중국에서 만든 오픈소스 AI에 대해서 말이 많다.특히나 다른 AI 서비스와 다르게 오픈소스 모델로 직접 로컬 컴...