728x90
안드로이드에서 Deivce의 설정을 통해 실제 시간과 다른 시간이 설정되었을 경우,
네트워크 통신에 실패하거나 각종 서비스 진입을 거부당하는 경우가 발생한다.
사용자 측면과 개발자의 측면에서 모두 이런 혼란을 방지하기 위해 실제 시간과
Device 시간이 동일한지 비교할 수 있는 방법이 필요했다.
그래서 'NTP 서버'를 활용한 비교 로직을 구성해본다.
NTP : Network Time Protocol의 약자로 Network 상에 연결된 장비와 장비 간에 시간 정보를 동기화하기 위한
프로토콜을 말하며 NTP 서버와 클라이언트 세팅을 통해 시간을 동기화
먼저 아래 라이브러리를 import 한다.
implementation 'commons-net:commons-net:3.6'
commons-net은 Apache Commons 프로젝트의 하나로, 네트워크 관련 유틸리티 및 컴포넌트를 제공하는 라이브러리다.
해당 라이브러리는 다양한 네트워크 프로토콜에 대한 구현체를 제공하며, 자바 프로젝트에서 네트워크 작업을 쉽게 처리할 수 있다.
private fun timeLookUp() {
val timeServerUrl = "time.google.com"
val timeClient = NTPUDPClient()
val inetAddress = InetAddress.getByName(timeServerUrl)
val timeInfo: TimeInfo = timeClient.getTime(inetAddress)
val returnTime: Long = timeInfo.message.receiveTimeStamp.time
val ntpTime = Date(returnTime)
val deviceTime = Date(System.currentTimeMillis())
}
이제 위와 같이 Time Server Url과 TimeStamp 데이터를 수신받아 실제 시간을 확인할 수 있다.
Time Server Url은 "time.google.com"을 사용했는데, 아래와 같이 다양한 URL을 사용할 수 있다.
pool.ntp.org (NTP Pool Project에서 제공하는 서버 풀)
time.windows.com (Microsoft에서 제공하는 서버)
time.apple.com (Apple에서 제공하는 서버)
다만, 각 서버에서 제한 사항이 존재할 수도 있으니 확인이 필요하다.
실제 시간 vs Device 시간 비교 결과
네트워크 타임 비교 : Mon Nov 20 11:14:32 GMT+09:00 2023 / Wed Nov 08 11:14:32 GMT+09:00 2023
728x90