2024/02 4

JWT와 토큰 생성, 강제 로그아웃에 대하여

JWT가 등장한 이유 기존에는 유저의 로그인 상태, 권한 등에 대한 정보를 파악하기 위해 로그인 시 '세션' 이라는 데이터 구조를 생성해 서버에 저장하고, 세션ID를 쿠키에 담아 클라이언트에게 전달해 주는 방식을 취해왔다. 그래서 로그인 상태를 파악하려면 세션ID를 서버에 전달해서 필요한 정보를 확인하는 흐름을 가졌다. 해당 방식은 서버에서 세션을 유지해야 함(stateful)을 의미하는데 이는 서버 메모리, 데이터베이스 혹은 메모리 캐시와 같은 저장소에 보관되었다. 이는 동시 접속 유저 수가 증가할수록 세션 정보를 조회하거나 상태 변경을 위한 요청 횟수가 증가함을 의미하고, 이는 곧 CPU, 메모리 자원 소모가 증가함을 의미한다. 또한 유저 수가 증가하면서 서비스의 규모가 증가하면 서버와..

데이터베이스의 1:N 관계에서 N+1 문제가 무엇인가?

ORM 사용에서 OneToMany와 ManyToOne과 같은 연관 관계로 묶인 테이블을 조회할 때 성능이슈가 발생하는 문제을 말한다. 가령 Channel과 User라는 Entity가 1:다 관계로 묶여 있다고 하고, Channel의 레코드는 총 10개가 있다고 가정하자. 이제 ORM으로 Channel Entity를 대상으로 findAll을 명령하면 내부적으로 "SELECT * FROM Channel"이라는 쿼리문 하나를 생성하여 데이터베이스에 요청할 것이다. 이때 생성된 쿼리문이 1개이고 딱 한 번 요청을 하는 것이다. 하지만 문제는 Channel과 연관된 User데이터도 함께 가져오려고 한다는 것이다. 그래서 최초 요청했던 findAll의 결과로 총 10개의 레코드를 획득할텐데, 이 각각의 채널에 속한..

var, let, const의 차이와 호이스팅, 스코프

자바스크립트에서 var, let, const 모두 호이스팅을 한다는 사실을 뒤늦게 알게 되었다. 사실 호이스팅 자체가 잘 이해가 가지 않았기 때문인 것 같다. "호이스팅은 선언된 변수나 함수를 코드의 상단으로 끌어올린다." 라는 표현을 쓰는데 이전에는 "var apple;을 선언한 뒤 console.log(apple)을 입력하고, 그 아랫줄에 apple = 1이라고 초기화하면 console.log(apple)은 1이 출력되어야 한다는 말인가?" 라고 받아들여졌다. 하지만 틀린 말이다. 실제로 출력값은 undefined가 나오기 때문에 별 문제가 없어보인다. 그럼 상단으로 끌어올려지는건 대체 뭐란 말인가? 호이스팅 일단 호이스팅은 스크립트의 컴파일 단계에서 벌어지는 일이라고 한다. 컴파일 과정에서 var,..

Redis에 대해서 살펴보자

아래 깃헙에서 더 깔끔하게 볼 수 있습니다. https://github.com/issuebombom/study_notes_nodejs_backend/blob/main/contents/redis.md Redis 캐시로 사용하기 Cache란?) 데이터의 원래 소스보다 더 빠르고 효율적으로 엑세스할 수 있는 임시 데이터 저장소 Redis는?) 단순한 key-value 구조로 저장하는 캐시 In-memory 저장소 (평균 작업 속도 < 1 ms) 캐싱전략(읽기) 데이터베이스에 접근하기에 앞서 Redis에 먼저 접근하여 필요한 데이터를 빠르게 가져온다.(Cache Hit) Redis에 필요한 자료가 없을 경우(Cache Miss) 데이터베이스에 접근하여 데이터를 가져오도록 한다. (Lazy Loading) 특징 ..