궁금한게 많은 열아홉
article thumbnail

필요성

현재 구현하고 있는 기숙사 입소 시스템은 입소 인증 방법에 대한 고민이 많았다. 우리 학교에서 입소를 인증한다는 것은, 다른 대학교에서 출석 인증을 하는 것과 다름 없기 때문에 그만큼 상당히 중요하다. 우회나 조작이 불가능해야 하고, 인증 요청자가 자기 자신이라는 것을 증명해야 한다. 그렇다 보니 인증은 보안에 매우 매우 중요하다. 그래서 여러 방법을 시도해보면서 어떤 방법을 쓰는 것이 적합할지에 대해 생각해보던 중 선생님을 통해 cron에 대해 알게되었다.

어떻게 쓸것인가

요즘 대학생들이 출석하는 모습을 본적 있는데, 이렇게 QR코드를 찍어서 앱에서 인증하도록 한다.

출처 : 유튜브 <전과자>

교수님께서 QR을 띄우면 학생들이 출석인증을 하는 방식인데, 우리가 그대로 적용하기엔 몇 가지 문제점이 있다. 

  • 우리는 사람마다 오는 시간이 다 다르다. (입소 시간이 오후 5시 ~ 8시 30분 사이) 오는 사람들을 위해 3시간 동안 밖에 있는건 무리이고, 시간 낭비다.
  • 그렇다고 QR 이미지를 벽에 붙이면 안된다. 누군가 찍어서 톡방에 올리면 입소 전인데도 입소 인증을 해서 조작이 가능하다.

이러한 문제점 때문에 나는 이를 응용하기로 했다.

  • 사람마다 오는 시간이 다 다르기 때문에 라즈베리파이와 디스플레이를 연결해서 QR을 띄운다. 기기만 세워두면 굳이 내가 밖에 있지 않아도 사람들은 인증 할 수 있다
  •  QR 조작 방지를 위해 QR의 값을 실시간으로 바꿔줄 것이다. 서버에서 문자열을 생성하고, 이를 Base64로 인코딩한 후 QR 이미지로 생성할 것이다. 웹에서 이를 찍으면 서버에서 가지고 있던 문자열과 비교하여 인증한다.

이때, 서버에서 특정 시간동안 문자열을 가지고 있을 수 있도록 하는 것이 cron이다.

Cron 이란

어떠한 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링 하기위한 Unix 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러.

우리 서버는 Node.js로 이루어져 있기 때문에 node-cron을 사용해 줄 것이다.

적용하기

node-cron 설치

npm i node-cron

node-cron import 해오기

const cron = require("node-cron");

스케쥴러 정의하기

나는 학생들이 스쿨 버스를 타고 올때 많이 몰리는 것을 생각해 3초에 한 번씩 값을 바꿔줄 수 있도록 하였다.

cron.schedule("3 * * * * *", () => {
  const randomNumber = Math.floor(Math.random() * 100);
  const randomString = Math.random().toString(36).substring(7);

  const combinedString = `${randomNumber}${randomString}`;
});

node-cron 실행 주기 표

사진 출처 : 여기

위 표를 참고하여 얼마를 주기로 작업을 실행할 것인지 정의할 수 있다. 

문자열 생성 API 만들기

3초 간격으로 문자열을 생성하고 key_table을 만들어 DB에 저장한다.

cron.schedule("3 * * * * *", () => {
  const randomNumber = Math.floor(Math.random() * 100);
  const randomString = Math.random().toString(36).substring(7);

  const combinedString = `${randomNumber}${randomString}`;

  const query = `INSERT INTO key_table (key_value) VALUES ('${combinedString}')`;
  connection.query(query, (error, results) => {
    if (error) console.error(error);
    console.info("key changed", combinedString);
  });
});

결과

그리고 이제 아까 정의해 준 스케쥴러의 console.log를 통해 확인해보면 아래와 같은 결과가 출력된다.

3초 간격으로 실행된다

그러면 이제 이 문자열을 base64로 인코딩하여 파이썬에서 QR 이미지로 만들면 된다! 그 이야기는 조금 길어 질 것 같으니 다음 시간에...

profile

궁금한게 많은 열아홉

@jjin502

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!