Access Token & Refresh Token
JWT(jsonwebtoken) 모듈을 이용해 만들 수 있는 토큰이다. Access Token은 인증을 위한 JWT이며 보안을 위해 유효기간이 매우 짧다. 반면 Refresh Token 은 유효기간이 짧은 Access Token을 보완하기 위한 JWT로서 Access Token에 비해 유효기간이 상대적으로 길다.
Access Token의 유효기간이 매우 짧기 때문에 Access Token을 매번 client가 발급받게 된다면 사용자 만족도가 매우 떨어질 것이고 반대로 유효기간이 너무 길게 된다면 보안에 취약해질 것이다.
이 단점을 방지하기 위해 Refresh 토큰을 함께 만들어주면 좋다. Access Token의 기간이 만료되었을 때 Refresh Token이 존재한다면 Access Token을 재발급하는 로직으로 만들어주면 보다 간단하게 토큰관리를 할 수 있다.
안전한 로그아웃
JWT 방식은 서버 측에서 사용자의 로그인 상태를 강제할 수 없다.
서버는 토큰을 발급하면 그 뒤로 토큰에 대한 제어권을 완전히 잃어버린다. 토큰을 누구에게, 언제 발급했는지에 대한 정보를 저장해두지 않기 때문이다. 토큰 자체에 사용자 정보와 만료시간을 포함하고 있으며, 서버 측에서 이를 확인하는 방식이기 때문이다.
데이터베이스를 전혀 사용하지 않는 순정 JWT 방식을 사용할 때, 로그아웃은 클라이언트 측에서 cookie나 local storage에서 JWT 토큰을 삭제하거나 무효화하는 방식으로 구현할 수 있다.
하지만 이 경우, 해커가 토큰을 탈취해서 사용한다면 서버는 토큰 만료 시간까지는 더이상 손쓸 방법이 없다. Refresh Token도 함께 탈취당한 경우에는 더 심할수도 있다.
따라서 데이터베이스를 전혀 사용하지 않는 순정JWT 방식으로는 안전한 로그아웃을 구현할 수 없다.
이를 해결하기 위해서는 DB를 사용하는 것이 좋은데 그 방법으로는 아래 두 개의 블로그에 잘 정리되어 있으니 참고하는 것이 좋다.
참고
https://engineerinsight.tistory.com/232
위 두 블로그까지만 참고했었는데 이 블로그도 정리가 잘 되어 있다.
'Node.js' 카테고리의 다른 글
[Node.js] nodemon (0) | 2023.11.28 |
---|---|
Backend -> Frontend로 쿠키 보내기(with Token) (0) | 2023.11.28 |
Express를 이용해 서버 만들기 (2) | 2023.11.14 |
모듈 (0) | 2023.11.11 |
[Node.js] REPL (1) | 2023.11.10 |