profile
이용자가 아닌 개발자가 되자!

[Node.js/Express.js] Session, Interceptor 기능 완성

블로그 이전 이전까지 세션과 인터셉터를 모두 개발 완료했다. 이제 매 요청 전 세션만 체크해주면 된다. 일단 해당 기능 적용 전 이전 글에서 Request 객체에 세션과 관련된 함수를 추가해주는 기능을 인터셉터로 변경해줬다. SessionManagerInterceptor 이렇게 매 요청마다 getSession(), removeSession()함수를 Request 객체에 정의해주는 함수를 호출하도록 인터셉터를 개발했다. ConfigLoader에 추가 ConfigLoader객체에서 loadInterceptorConfig()를 통해 이용자가 개발한 인터셉터를 등록하기 전 `load

2023년 4월 8일
·
0개의 댓글
·

[Node.js/Express.js] Session 구조 변경

블로그 이전 지난번 개발한 세션의 구조적인 변경을 진행했다. 이유는 현재 사내 프레임워크는 config.js라는 object에 필요한 정보들(DB host, port 등 과 같은 정보들)을 필드로 가지게 하고, 필요한 곳에서 모듈로 가져와 참조하는 방식을 사용했다. 그 중 Redis client와 관련된 정보도 있었다. 문제는 여기서 발생한다. 나는 config.js에 어떤 세션 스토어를 사용할지 명시할 계획이었으므로 개발자가 레디스 스토어를 사용하게 된다면 config.js에 와 같이 적히게 되고 RedisSessionStore.js는 와 같은 형태로 client를 생성하기 때문에 순환참조 문제가 발생한다. 이 외에도 많은 곳에서 config를 참조하게돼 구조적으로 좋지 않다고 생각했다. 일단 config.js 자체가 썩 좋아보이진 않았지만, 이미 만들어진 구조는

2023년 4월 7일
·
0개의 댓글
·

[Node.js/Express.js] Session 기능 - 쿠키 설정

블로그 이전 Redis로 세션을 저장하는 기능을 구현했지만, 흐름상 쿠키에 세션 key를 담아줄 경우 프록시서 버에서 쿠키를 탈취해 해당 key로 요청을 날리는건 마찬가지라는 생각을 했다. 요즘 JWT 같은 방법으로 인증관리를 구현한다고 알고있지만 아직 내가 잘 알지 못하고, 회사 분위기도 해오던 방법을 거스르는것에 반감이 있다보니 세션을 유지하고자 했다. JWT에 대해 알아볼때 봤던것이 쿠키에 httpOnly옵션을 줘서 클라이언트에서만 쿠키에 접근할 수 있도록 한다는 것을 참고해서 내가 구현한 세션/쿠키 방식에도 httpOnly 옵션을 추가하기로 했다. 쿠키 옵션 추가 기존 RedisSessionStore - geSession() RedisSessionStore에서 getSession()부분을 보면 `res.cookie(SessionStore.sessionKey

2023년 4월 4일
·
0개의 댓글
·

[Node.js/Express.js] Session, Interceptor 기능 개발 - RedisSession, MemorySession

블로그 이전 HttpSession class 여러 세션 스토어에 저장될 세션 객체는 공통으로 사용하도록 구상하고 개발했다. 기본적으로 Map변수에 정보들을 key-value형태로 담고 꺼내도록 구상했다. SessionStore class interface로 추상-구현 관계를 사용하고 싶었지만 만들어진 프레임워크 자체가 TS를 지원하지 않아 어쩔수 없이 비슷하게 함수들을 선언하고 재정의 없이 호출하면 Error가 나도록 구현했다. 사실 JS 장점이라면 장점인 동적 프로그래밍으로 자료형을 정해주지 않아도 위 함수들이 구현되어 있다면 동작하는데는 문제가 없다. 하지만 전글에도 적었듯이 나는 서버는 신뢰성이 중요하다 생각해 상속을 하면 함수들을 한번씩은 확인할것이라 생각해 이런 구조로 개발했다. MemorySessionStore Memory에 저장하는 SessionStore이다.

2023년 4월 3일
·
0개의 댓글
·
post-thumbnail

[Node.js/Express.js] Session, Interceptor 기능 개발 - 설계

블로그 이전 입사 하자마자 진행했던 프로젝트인 paperless 회진 앱의 보안 점검 결과로 여러 문제점을 지적 당했다. 크게 앱 단계의 문제와 서버 단계의 문제로 나눌 수 있었는데, 서버쪽 문제는 세션 미적용 SQL Injection 문제가 있었다. 이중 세션은 사실 JS의 Map변수를 이용해 로그인 하는 시점에 생성, setTimeout()을 통해 30분 후 해당 세션 삭제와 매 요청시 setTimeout()의 key값으로 clearTimeout()을 호출하고, 다시 30분 시작을 하도록 구현했었다. 테스트시에는 문제가 없었지만, 실제 서버에 올려보니 30분이 되지 않았는데 세션이 삭제되는 등 많은 문제가 있었다. 개발 당시에는 내가 굉장히 무지(?)했기 때문에 여러 상황을 고려하지 못했는데 지금 생각해보면 당연히 동시성 문제가 나도록 개발을 했다. 대충 코드를

2023년 4월 2일
·
0개의 댓글
·