Menu
CoddyTech

키 바이트 비교하기

Coddy Node.js 여정의 인증과 보안 섹션에 포함된 레슨. 24개 중 5번째.

서로 다른 두 Buffer 객체가 같은 바이트를 담을 수 있습니다. 이 객체들을 ===로 비교하면 바이트 내용이 같은지가 아니라 객체의 동일성을 확인합니다. 비밀 키에는 timingSafeEqual을 사용하세요. 처음 불일치하는 지점에서 멈추는 바이트 단위 비교는 실행 시간으로 정보를 노출할 수 있습니다. 이 함수는 일정한 시간의 바이트 비교를 사용하지만, 나머지 로그인 코드에서도 실행 시간 정보가 새지 않도록 해야 합니다.

const same = token.length === savedToken.length
    && timingSafeEqual(token, savedToken);

길이가 다르면 timingSafeEqual이 오류를 발생시키므로 길이 확인이 중요합니다. && 표현식은 길이가 다를 때 비교를 건너뜁니다. 시작 코드에서 제공된 16진수 문자열을 Buffer로 디코딩해 둡니다. 불리언 결과를 반환하는 데 집중하세요. 완전한 비밀번호 로그인에서는 먼저 입력한 키를 파생한 다음 이 비교를 수행합니다.

challenge icon

챌린지

쉬움

이것은 간단한 연습 프로젝트입니다. 설정은 제공되어 있으니 exercise.js만 수정하세요.

given과 expected에 동일한 바이트가 들어 있으면 {"same":true}를 반환하고, 그렇지 않으면 false를 반환하세요. {"given":"abcd","expected":"abcd"}를 /result에 POST하면 true가 반환됩니다. given을 abce 또는 ab로 바꾸면 예외를 던지지 않고 false가 반환됩니다. 입력은 유효한 16진수입니다.

바이트 길이를 확인한 다음 가져온 timingSafeEqual의 결과를 사용하세요. 인코딩된 문자열이나 Buffer의 동일성을 비교하는 것은 여기서 연습하는 안전한 연산이 아닙니다.

직접 해보기

import { timingSafeEqual } from 'node:crypto';
export function exercise(input) {
    const given = Buffer.from(input.given, 'hex');
    const expected = Buffer.from(input.expected, 'hex');
    return { same: given === expected };
}

인증과 보안의 모든 레슨

직접 연습해 보세요: Express 플레이그라운드