인증, OAuth, JWT, 보안

HTTP Header를 이용한 클라이언트 타입 확인 방법

Developer88 2024. 9. 14. 13:43
반응형

인증 및 보안을 할 때는,

디바이스의 특징에 따라서 다른 접근이 필요한 경우가 발생합니다.

이럴 대, HTTP Header를 사용해서 클라이언트, 즉 디바이스의 타입을 구별할 수 있는데요.

오늘은 HTTP Header를 이용한 클라이언트 타입 확인 방법을 알아보겠습니다.

 

1. User-Agent 헤더 활용하기

User-Agent 헤더는 클라이언트의 브라우저, 운영 체제, 디바이스 등의 정보를 포함하기 때문에,

이를 활용해서 클라이언트의 타입을 확인할 수 있습니다.

 

const userAgent = req.headers['user-agent'];

if (userAgent.includes('Mobile')) {
  // 모바일 디바이스
} else if (userAgent.includes('Tablet')) {
  // 태블릿 디바이스
} else {
  // 데스크톱 또는 기타
}

 

 

다만, 이 방법은, 클라이언트에 의해 쉽게 조작될 수 있으므로,

완전히 신뢰할 수 있는 방법은 아닙니다.

보안이 중요하다면, 아래에서 소개하는 Custom헤더를 사용하는 것이 좋습니다.

 

2. Custom 헤더 사용

2-1. Custom 헤더 사용

아래 코드와 같이 Custom 하게 특정한 헤더이름을 정해서,

거기에 들어오는 값을 가지고 판별할 수 있습니다.

필요에 따라서,

모바일앱인지만 구별할 수도 있고요.

좀 더 상세하게 안드로이드앱인지,

ios앱인지도 구별할 수 있겠지요.

 

const clientType = req.headers['x-client-type'];

if (clientType === 'mobile-app') {
  // 모바일 앱
} else if (clientType === 'web-browser') {
  // 웹 브라우저
}

 

 

 

위에서 사용된 'x-client-type' 이라는 헤더이름은,

일반적인 HTTP 헤더 네이밍 컨벤션을 따르는 사용자 정의 헤더인데요.

과거에 비표준 또는 사용자 정의 헤더를 나타내기 위해 'x-'를 붙여서 이름을 지어 사용했기 때문에,

이런 식으로 사용되었습니다.

 

이렇게 'x-'를 붙이는 컨벤션은 2012년 6월부터 공식적으로 폐기되었는데요.

여전히 널리 사용되고 있기는 합니다.

x- 접두사 없이 'client-type'과 같이 사용하거나,

더 명확한 구분을 위해 myapp-client-type과 같이 애플리케이션 이름을 접두사로 사용하는 것도 방법입니다.

 

2-2. 헤더 네이밍 규칙

참고로, HTTP 헤더 이름을 정할 때는 일반적으로 다음과 같은 규칙을 따릅니다.

  • 소문자로 작성: 대소문자를 구분하지 않지만, 일반적으로 소문자로 작성함.
  • 하이픈으로 단어 구분: 여러 단어로 구성된 헤더 이름은 하이픈(-)으로 구분합니다.
  • 설명적인 이름 사용하기: 헤더의 목적을 명확히 나타내는 이름을 사용합니다. 

 

3. Accept 헤더 확인

또 다른 방법이 있을 수 있는데요.

클라이언트가 처리할 수 있는 컨텐츠 타입을 나타내는 Accept 헤더를 사용하는 방법입니다.

JSON을 필요로 하는 클라이언트와 HTML을 처리할 수 있는 웹브라우저 같은 클라이언트의 구분이 가능하겠지요.

 

const accept = req.headers['accept'];

if (accept.includes('application/json')) {
  // JSON을 처리할 수 있는 클라이언트
} else if (accept.includes('text/html')) {
  // HTML을 처리할 수 있는 클라이언트
}

 

 

이상으로 HTTP Header를 이용해서 클라이언트 타입을 확인하는 방법들에 대해서 알아보았습니다.

728x90