예시로 받은 코드를 뜯어보고 전에 구현했던 내 방식에서 생각하지 못한 부분들 위주로 작성해보았다.
JWT 블랙리스트
- 단순히 잘못된 토큰을 가진 정보들을 모아둔 것이라 생각했다.
- 한번 발급한 jwt를 무효화할 방법이 없으니 로그아웃 해도 만료시간 전에 해당 토큰을 그대로 사용할 수 있는 문제를 해결하기 위한 방법
- 지난 프로젝트에서는 따로 생각해보지 못한 부분
로그인시 접속 로그 저장의 이유?
- 지금까지 프로젝트를 하면서 간과했던 부분
- 사용자의 접속 로그를 모니터링하면 비정상적인 접근 시도나 패턴을 식별하여 보안 위협을 초기에 알 수 있으며, 시스템의 오류나 문제를 진단하는 데 도움을 주고, 사용자의 행동을 분석하여 사용자 경험을 개선하고, 맞춤형 콘텐츠나 광고 제공에도 쓰임
또한 비즈니스 결정의 유용한 인사이트 제공하여 그에 맞는 전략 수립시에도 쓰임
- request 객체에서 받을 수 있는 ip, endpoint, user agent를 활용하신걸로 보임
- endpoint? -> 사용자가 어떤 작업을 수행하려고 했는지, 어떤 페이지나 리소스에 관심이 있는지
- user agent? -> 사용자가 요청을 보낼 때 사용한 브라우저, 운영 체제, 장치 등에 대한 정보
argon2
- 기존 비밀번호 해싱은 crypto나 bcrypt를 사용해왔음
- argon2 는 암호를 해싱하는데 걸리는 시간이나 소요되는 메모리 양을 설정할 수 있게 설계되었고, 사용하는 목적에 맞게 파라미터 변경으로 적용이 가능
- 키 유도 함수(key derivation function)
- Argon2d, Argon2i, Argon2id 3종류이며 비밀번호 해싱에 적합한 것은 Argon2id
해싱처리
const hashedPassword = await argon2.hash(dto.password);
인증처리
if (user && (await argon2.verify(user.password, plainPassword))) {
return user;
}
키 유도 함수?
- 일정한 길이의 비밀 키를 생성하기 위해 비밀 비트 문자열(예: 비밀번호, 패스프레이즈)을 사용하는 암호학적 함수
- 여러 다른 키도 생성 가능하며 복호화도 가능
메모리 사용량, 연산 시간, 병렬 처리 등 다양한 파라미터 조정과 보안이 어떠한 연관성이 있는지?
- 메모리 사용량을 높이면 공격자가 동시에 많은 수의 해시를 계산하는 것이 더 어려워진다고 합니다.
-> 대규모 병렬처리 이용 공격(GPU, ASIC 등) 저항력 강화
- 연산 시간을 늘리면 해시를 계산하는 데 더 많은 시간이 소요
-> 무차별 대입 공격에 대한 저항력 강화
- 병렬 처리는 해시 계산 시 사용할 수 있는 병렬 쓰레드 수를 지정함으로써 수준을 높이면 해싱 수행시 많은 CPU 자원이 필요
-> 비용 대비 효과적인 공격에 대한 어려움이 증가, 시간-메모리-트레이드오프(TMT, 해싱 과정에서 메모리와 시간 사이의 관계를 이용하는 공격) 공격에 대한 저항력 강화
처음 본 기술스택
- SWC(Speedy Web Compiler)
- 기존에 알던 babel의 역할과 동일해보였으나 babel의 싱글 쓰레드의 속도 문제를 해결한 컴파일러로 작게는 몇 배, 크게는 몇 십 배나 빠른 성능을 자랑하는 빌드 도구
- swc 사용의 이유를 정리하자면, 빠른 속도로 자바스크립트 코드를 트랜스파일 하거나 타입스크립트 컴파일을 위해
- Yarn berry + Plug'n'Play + Zero-Install
- 각각의 프로그램인줄 알았으나 Plug'n'Play와 Zero-Install은 Yarn berry의 중요한 특징들이었음
- Plug'n'Play (PnP)는 기존의 node_modules 폴더 방식 대신, PnP 방식을 도입하여 의존성을 관리
-> 프로젝트의 부팅 시간 단축시키는 효과와 파일 시스템을 더 효율적으로 사용하게 해준다.
- Zero-Installs의 개념은 프로젝트의 의존성 정보를 .yarn/cache에 저장하여, 다른 개발자와의 협업 시 의존성 설치 과정을 건너뛰게 해주는 것
-> CI/CD 파이프라인에서의 빌드시간 단축의 효과가 있다.