개발자
JWT 를 사용하여 로그인 기능을 구현 하였습니다. 저같은 경우에는 로그인시 에세스토큰과 리플레시 토큰을 생성해서 사용중이 mysql 테이블에 저장을하고 토큰 두개를 반환하면 프론트(리엑트) 에서 세션 스토리지에 저장해서 에세스 토큰으로 통신하다가 만료가 되면 리플레시를 요청하고 리플레시를 보내서 데이터베이스에서 유효시간과 변형이 되지 않은것을 확인하면 다시 에세스 토큰을 발급하는 시스템으로 구현을 했는데요 이때 에세스 토큰은 30분 리플레시 토큰은 8시간을 주고 개발 하였습니다. 그런데 생각해보니 로그아웃을 구현 안했더라고요 프론트에서는 로그아웃하면 세션스토리지를 날려버리면 끝인데 RestAPI라 데이터만 주고 받으면 되는 형식이라 딱이 제가 받는게 없다는겨죠 그렇게 로그아웃을 찾아 보다가 다른분들은 Redis를 사용하여 리플레시 토큰을 입력받은 아이디를 key로 저장한후에 에세스를 발급하고 로그아웃하면 그토큰을 블랙리스트로 만들더군요 만료시간후에 자동 삭제되게 설정도 하는거 같아요 이게 어느 방향으로 개발하는게 맞는지 도통 모르겠습니다. 로그아웃 할때마다 리플레시를 무효화 시키고 로그인할 때 새로 생성해서 저장하는게 맞는지 로그아웃해도 데이터베이스에 리플레시 유효기간이 남아 있다면 그것을 계속 사용하는게 맞는건지 어느 글들을 보면 리플레시를 7일 한달도 주는 경우가 있더라구요... 그래서 잘 모르겠습니다. 로그인 -> 에세스,리플레시토큰 발급 -> 프론트 세션스토리지 저장 -> 에세스로 통신 -> 만료되면 리플레시 요청 -> 프론트에서 리플레시 통신 -> 데이터 베이스 확인후 유효검사후 에세스 다시 발급 -> 재로그인시 유효시간이 남으면 기존의 리플레시 토큰 사용 로그인 -> 에세스,리플레시토큰 발급 -> ........ -> 로그아웃시 Redis에 블랙리스트로 저장 -> 블랙리스트 접근불가 -> 다시로그인시 리플레시 새로발급 실무에서는 어떻게들 관리하시는지 알려주시면 감사하겠습니다.
답변 1
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 02월 03일
이러한 시나리오의 경우, 개발자마다 다를 수 있지만 일반적인 로그아웃 처리 방법은 토큰을 무효화하는 것입니다. 즉, 사용자가 로그아웃을 할 때마다 해당 토큰은 더 이상 유효하지 않게 되는 것이죠. Redis를 이용하여 '블랙리스트'로 관리하는 방법도 하나의 좋은 해결책입니다. 이렇게 하면, 로그아웃 한 사용자가 가지고 있는 토큰은 블랙리스트에 추가되어서 이후 그 토큰으로 서버에 요청을 보내도 인증되지 않습니다. Redis는 속도 측면에서 DB보다 빠르며 메모리 기반이므로 자동 삭제 등의 연산 부하도 적습니다. 그런데 이 경우에는 중요한 한 가지 주저할 부분이 있습니다. 바로 로그아웃 후 해당 사용자가 재로그인을 안하고 계속 그 토큰(기존 리플레시 토큰)을 가지고 있다면, 짜투리 시간 동안 그 토큰으로 악용할 가능성이 생깁니다. 따라서 좀 더 안전한 방법으로는, 로그아웃시 해당 사용자의 저장된 모든 토큰을 무효화하는 것이 있습니다. 즉, 로그아웃 시 DB에 저장된 리플레시 토큰을 삭제하고, 사용자가 다음 번 로그인할 때 새로운 토큰들을 발급받게 하는 방법이죠. 이렇게 하면 기존의 토큰을 악용할 여지가 없습니다. 말씀하신대로 JWT의 유효 기간은 상황에 따라 조절해야 합니다. 에세스 토큰은 굳이 길게 할 필요 없고 리플레시 토큰은 길게 주는 것이 일반적입니다. 위 결론에 도달한 이유로 인증 시스템에서는 '안전성'과 '사용자 경험(UX)' 사이에 타협점을 찾아야 한다는 점입니다. 클라이언트에 너무 많은 부담을 주지 않으면서도 서버에서 최대한 안전하게 정보를 관리해야 합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!