PHP로 모바일을 체크하는 코드 다루기
PHP로 현재 브라우저가 모바일 장치(스마트폰, 태블릿 등)에서 실행되는지 체크하는 코드에 대해 다룹니다.
모바일을 체크하는 코드는 함수로 다루겠습니다. 이 함수는 모바일을 체크하는 함수로 모바일 장치를 식별하는 데 사용될 수 있는데, 이는 모바일 환경에서 특정 기능을 제공하거나 모바일 및 데스크톱 사용자에게 다른 경험을 제공하는 웹사이트에서 유용할 수 있습니다.
일러두기
여기서 다루는 모바일을 체크하는 방법은 정확성과 확장성 면에서 제한이 있을 수 있으므로, 정확성이나 확장성을 보장하거나 보증할 수 없습니다. 따라서, 모든 자료와 예제를 신뢰하기 전에 스스로의 판단에 따라 오류, 버그, 취약점이 없는지 신중하게 테스트하고 검토해야 합니다.
같이 보기
모바일을 체크하는 함수
코드를 작성할 때 웹 애플리케이션의 사용자 환경을 고려하는 것은 매우 중요합니다. 특히 모바일 기기에서의 사용을 고려할 때는 이에 대한 체크가 필요합니다. 이를 위해 PHP를 사용하여 모바일 기기를 감지하는 함수를 만들어보겠습니다.
우선, PHP에서는 사용자의 웹 브라우저에서 전달되는 HTTP_USER_AGENT
헤더를 통해 사용자 에이전트 정보를 확인할 수 있습니다. 이 정보를 기반으로 모바일 장치인지 여부를 판단할 수 있습니다. 또한 최근 PHP 8에서는 str_contains()
함수가 도입되어 특정 문자열이 포함되어 있는지를 간편하게 확인할 수 있습니다. 하지만 PHP 8 미만의 환경에서는 이 함수를 사용할 수 없으므로, 이를 대체하기 위한 polyfill 함수도 함께 제공할 것입니다.
다음은 모바일을 체크하는 함수의 구조입니다.
/**
* PHP 8에서 소개된 str_contains() 함수를 polyfill로 대체하는 함수입니다.
* PHP 8 미만의 버전에서 str_contains() 함수를 사용하기 위해 사용됩니다.
*
* @param string $haystack 대상 문자열입니다.
* @param string $needle 찾고자 하는 부분 문자열입니다.
* @return bool 주어진 문자열이 부분 문자열을 포함하면 true를, 그렇지 않으면 false를 반환합니다.
*/
if (!function_exists('str_contains')) {
/*
* str_contains() 함수의 polyfill
* 출처: https://core.trac.wordpress.org/browser/trunk/src/wp-includes/compat.php#L423
*/
function str_contains($haystack, $needle) {
if ('' === $needle) {
return true;
}
return false !== strpos($haystack, $needle);
}
}
/**
* 모바일 장치를 감지하여 체크하는 함수입니다.
* HTTP_SEC_CH_UA_MOBILE 헤더를 확인하고, HTTP_USER_AGENT를 분석하여 모바일 장치인지 여부를 판단합니다.
*
* @return bool 모바일 장치가 감지되면 true를, 그렇지 않으면 false를 반환합니다.
*/
function is_mobile() {
if (isset($_SERVER['HTTP_SEC_CH_UA_MOBILE'])) {
// HTTP_SEC_CH_UA_MOBILE 헤더가 존재하고, 값이 '?1'인 경우 모바일로 판단합니다.
// 참조: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA-Mobile
return ( '?1' === $_SERVER['HTTP_SEC_CH_UA_MOBILE'] ); //
} elseif (!empty($_SERVER['HTTP_USER_AGENT'])) {
// HTTP_USER_AGENT를 분석하여 모바일 특징을 찾습니다.
$user_agent = $_SERVER['HTTP_USER_AGENT'];
return str_contains($user_agent, 'Mobile')
|| str_contains($user_agent, 'Android')
|| str_contains($user_agent, 'Silk/')
|| str_contains($user_agent, 'Kindle')
|| str_contains($user_agent, 'BlackBerry')
|| str_contains($user_agent, 'Opera Mini')
|| str_contains($user_agent, 'Opera Mobi');
} else {
// HTTP_SEC_CH_UA_MOBILE 헤더도 없고, HTTP_USER_AGENT도 없으면 모바일이 아닌 것으로 간주합니다.
return false;
}
}
/* 모바일 여부에 따라 다른 코드를 실행합니다. */
if(is_mobile()) {
// 모바일 환경에서 사용할 코드
} else {
// 데스크탑 환경에서 사용할 코드
}
위 코드는 PHP에서 모바일을 감지해서 체크하는 간단한 함수를 제공합니다. 하지만, 위 예시 코드의 한계성도 반드시 확인하시기 바랍니다.
위 예시 코드의 한계점
위 예시 코드는 몇 가지 한계점을 가지고 있습니다. 여기에는 다음과 같은 사항들이 포함됩니다.
HTTP_USER_AGENT
의 한계성
사용자 에이전트 문자열을 분석하여 모바일 장치를 감지하는 것은 신뢰성이 낮을 수 있습니다. 사용자 에이전트는 사용자가 직접 휴대폰 브라우저에서도 데스크톱 모드로 변경할 수 있습니다. 따라서 이 코드는 사용자 에이전트에 대한 한계성을 가지고 있습니다. 또한 클라이언트 측 정보는 보안 관련 목적으로 활용할 경우에 추가적인 적절한 조치가 필요합니다.
새로운 모바일 디바이스 추가에 대한 확장성
코드는 모바일 장치를 감지하기 위해 HTTP_USER_AGENT
헤더를 분석합니다. 새로운 모바일 디바이스가 출시될 때마다 해당 장치의 사용자 에이전트 문자열 패턴을 고려하여 코드를 업데이트해야 합니다. 이는 새로운 모바일 디바이스가 추가되는 경우 유지보수를 요구할 수 있습니다.
캐싱된 사용자 에이전트 값의 불일치
캐싱이 적용된 경우, 동일한 사용자 에이전트 값을 가진 여러 사용자가 다른 디바이스에서 액세스할 때 문제가 발생할 수 있습니다. 캐시된 사용자 에이전트 값이 고정되어 있으면, 새로운 디바이스나 브라우저에서 액세스할 때 올바른 결과를 반환하지 못할 수 있습니다. 이는 사용자 경험을 저하시키고 잘못된 결과를 제공할 수 있습니다.
따라서 캐시를 구현할 때는 사용자 에이전트 값이 캐시되지 않도록 주의해야 합니다. 대신 사용자를 식별할 수 있는 안정적인 방법을 사용하여 캐시를 구성해야 합니다.