본문 바로가기

Front-End

[JS] new Date() 함수의 위험성

728x90

JS의 Date 객체는 쉽게 말해 JS로 현재 시스템 날짜를 제어할 수 있게 도와주는 JS에 내장된 객체입니다. 그래서 Date.prototype을 찍어보면 다음처럼 나옵니다.

*시스템 날짜이기 때문에 휴대폰에서는 기기의 시간, PC에서는 PC에 설정되어 있는 시간대를 이용하죠.

 

constructor을 찍어보면 native code 라고 나오고 실행시켜보면 현재 시간을 계산하여 return 해줍니다.

더보기

constructor 메서드는 클래스의 인스턴스 객체를 생성하고 초기화하는 특별한 메서드입니다.

 

내부 코드를 볼 순 없지만 사실 개발하면서 굳이 내장 함수를 들여다볼 일이 별로 없긴 해서 저도 찾아보다 포기했습니다ㅠ

이 Date 함수의 사용법에 대한 자료는 찾아보시면 많습니다.

 

이번 포스팅을 통해 얘기하고 싶은 것은, 서비스를 개발할 때 이 new Date 함수를 사용하는 것이 다소 위험할 수 있다는 것입니다.

 

증권 서비스는 업무를 처리할 수 있는 시간이 있습니다. 공모주는 청약을 진행하는 기간에만 처리가 가능하고 환전과 출납 등의 업무는 업무 시간에만 가능합니다. 따라서 사용자가 허용된 시간이 아닌 시간에 서비스 처리를 요청하면 이를 차단하는 기능을 클라이언트에서 하냐, 서버 단에서 하냐는 매우 중요한 의사결정이 됩니다.

 

대부분의 서비스는 서버단에서 접속한 시간을 체크하고 허용할지 차단할지를 결정합니다. 이게 올바른 처리 방법이고요.

하지만, 처음 설계를 할 때 클라이언트에서 시간을 체크하기로 하여 서버로 보내는 과정에서 기기 시간을 체크하도록 했다면 발생할 수 있는 문제는 다음과 같습니다.

 

1. 사용자가 기기 시간을 제어하여 업무 처리를 할 수 있다. (물론 서버단에서 업무 처리가 안되게 최종적으로 막아야만 합니다.)

 

2. 해외에 있는 고객은 한국 시간에 맞춰 업무를 처리하려 해도 기기 시간이 해외 기준이기 때문에 업무 처리가 안될 것입니다. (이 경우 사용자는 컴플레인을 걸 수밖에 없죠)

 

설계부터 잘못되었기 때문에 이를 수정하는 방향은 서버와 클라이언트 다 고쳐야 하기 때문에 대규모 서비스를 하고 있는 회사 입장에서는 부담스럽습니다. 따라서 우선적으로 클라이언트 소스만 수정하고 서버 개발자와 협업을 통해 천천히 개선해나가야 합니다.

 

클라이언트 소스는 다음과 같이 수정했습니다.

현재 시간을 조회하는 함수 new Date() 를 바로 사용하지 않고 한국 시간으로 변환해주는 함수를 만들어 이를 대체하는 것입니다.

 

Date.prototype.getKorDate=function(){
    const utc = this.getTime() + (this.getTimezoneOffset() * 60 * 1000);

    // 3. UTC to KST (UTC + 9시간)
    const KR_TIME_DIFF = 9 * 60 * 60 * 1000;
    const kr_curr = new Date(utc + (KR_TIME_DIFF));
    return kr_curr;
};

 Date 함수의 프로토타입 함수를 추가합니다. 기기 시간을 가져와 UTC 기준 시간으로 변환하고 한국 시간으로 변환하는 함수입니다. 

컴퓨터 시간을 태평양표준시로 변경 후 console에 찍어봅니다.

console.log("현재 기기 시간 " + new Date().getHours() +"시"+ new Date().getMinutes() +"분"+ new Date().getSeconds()+"초");

console.log("현재 한국 시간 : " + new Date().getKorDate().getHours() +"시"+ new Date().getKorDate().getMinutes() +"분"+ new Date().getKorDate().getSeconds()+"초");

개발환경 : node

 

임시방편으로 사용한 방법입니다. 가장 좋은 방법은 모든 시간 체크 로직을 서버단에 맡기는 것이죠.