개발/cloud, server, network

[http api] 특정 api에서만 헤더의 쿠키가 보이지 않는 경우

prpn97 2023. 7. 22. 20:56

문제

같은 라우터에서 api를 실행했다. 어떤 api에서는 req.cookies의 값이 정상적으로 확인되는데,

특정 api에서만 req.cookies 값이 null로 확인되었다. 

마찬가지로 세션데이터 등 여러 req에 관한 값이 확인되지 않았지만,

req 자체는 정상적으로 확인되었다.

납득이 되질 않았다. 미들웨어 자체의 순서나 다른 부분의 문제일 수가 없는게, 

같은 라우터 안에서 컨트롤러만 다른 상황이라 동일한 순서 안에서 실행되는 것이기 때문이다. 

 

세션을 검사하는 api에서는 쿠키가 보이는데, 세션을 연장하는 api에서는 쿠키가 보이질 않았다.

 

해결 과정

 

두 api의 차이점은 메서드였다. 세션을 검사하는 api는 get, 세션을 연장하는 api는 put이였다. 

 

세션 검사는 조회하는 것이기 때문에 get이 맞고, 연장을 확인하기 전에 만료시키는 방법을 보면

세션을 만료시킬 때 쿠키를 건드리지 않고 db에서만 만료시키는 방법으로 구현했는데,

express-session에서는 쿠키에 관한 설정이므로 쿠키관련 기능을 사용하지 않고

db에서만 보이는 세션데이터에 세션을 발급할 때 발급시간을 기록하고,

별도로 발급시간 + 만료시간으로 해당 시간이 되면 세션을 만료시키도록 미들웨어를 구현했다. 

 

그렇기 때문에 세션을 연장할 때는 req.session.data의 값을 리프레쉬 해주는 방법으로

새롭게 발급시간을 설정하게 되면 그때로부터 만료시간이 설정되도록 하였다. 

그렇다면 세션 데이터를 새롭게 덮어씌우기 때문에 put으로 메서드를 설정했다.

 

 

그런데 여기서가 문제였다. get으로 두면 req.cookies가 잘 확인되는데,

put과 patch는 req.cookies가 확인되지 않았다. 

 

메서드마다 보안에 있어 다른 부분이 이런 부분이지 않을까 싶다. 

먼저 세션 연장할 때도 get으로 바꿔주니까 req.cookies도 그렇지만

세션데이터도 잘 확인되어서 정상적으로 세션데이터가 업데이트되었다.

 

일단 당장 방법이 떠오르지 않아 임시로 get으로 두긴 하지만,

api를 분리해서 쿠키를 조회해서 put메서드로 해결할 수 있도록 수정해야겠다. 

 

728x90