nestjs passport jwt 사용하고 있는데
1. 로그인 성공 시 엑세스 토큰, 리프레시 토큰 발급
리프레시 토큰 페이로드에는 아무 값도 담지 않음
redis에 리프레시 토큰 : 유저 아이디 이런 형식으로 저장 ttl은 리프레시 토큰 만료시간과 동일
2. 엑세스 토큰 만료시 프론트에서 서버로 리프레시 토큰만 보내줌
유효성 검사후 redis에 해당 토큰이 있는지 확인 없으면 예외처리,
있으면 유저 아이디 꺼내서 엑세스 토큰 재발급
3. 로그아웃 시 프론트에서 서버로 리프레시 토큰만 받아와
유효성 검사후 redis에서 해당 리프레시 토큰 삭제
일단 이렇게 구현했는데
1. 사람마다 jwt 사용하는 방식이 다 다르던데 어떻게 사용하면 좋을지
예를 들어 토큰 재발급할 때도 엑세스 리프레시 둘다 받아서 둘다 재발급 하거나
리프레시 토큰도 빈 페이로드로 두지 않고 유저 아이디를 넣어둔다거나
2. 로그아웃 시 리프레시 토큰만 받아와 검증하고 삭제하는데
둘다 받아와 엑세스토큰만 검증하고 엑세스 토큰은 다시 남은 유효시간 계산해서 redis에 등록해서 사용하지 못하게 하던데
이 경우 로그아웃 하려고 할때 엑세스토큰이 만료되었으면 다시 엑세스토큰을 재발급 받아서 로그아웃 해야할텐데
좀 모순되는 방법이 아닌지?
3. 현재 리프레시 토큰 페이로드는 비어있어서 따로 페이로드에 담긴 값으로 db 조회를 한다거나 하는 로직이 없는데
리프레시 토큰을 jwt가 아닌 uuid나 난수를 발생시켜서 사용하면 어떨지 ?
1. 니가 만든게 정석임 2. 로그아웃은 리프레시 토큰과 액세스 토큰을 지우는거임 액세스토큰은 쿠키에 저장돼있으면 쿠키에서 제거하면 되고, 클라의 로컬스토리지 등에 저장돼있으면 클라가 알아서 지우면 됨 니 말 뭔말인지 모르겠음 3. 리프레시 토큰을 jwt로 쓰든 그냥 키값만 쓰든 상관 없음
찾아보니 Best practice는 엑세스는 프론트에서 자바스크립트 private 변수로 관리하고 리프레시는 httpOnly 쿠키에 관리하는게 정석같던데 맞나요?? 보안적으로 뭔가 부실한 것 같은데 어떤걸 더 추가해볼 수 있을까요??
봤던 유튜브 강의는 로그아웃할때 서버로 리프레시 토큰만 받아오고 엑세스는 그냥 로컬스토리지에서 삭제했는대, 또 어떤사람을 둘다 받아와서 물어봄
베스트는 없음 선택만이 있을뿐 보안적으로 뭐가 부실하단건지 말을 해야 답변 가능 '뭔가'라는 단어를 쓰면 개허접됨 기술적인 대화 할때는 '뭔가' 라는 말 의식적으로 쓰지 마셈
로그아웃할때 액세스토큰을 서버로 보낼 이유가 없음 무상태인데 뭐 어쩔라고 정확한건 그 유튜브 링크를 줘야 알겠음
토큰이 탈취당했을때 어떤 방식으로 대응 할 수 있을지 모르겠음 이건 그냥 jwt 태생적인 문제같은데 보관을 잘하는 방법 뿐일까
토큰이 탈취당했을 때를 대비해서 refresh token이 있는건데 jwt 이해가 좀 부족한듯?
엑세스 토큰 탈취당해서 유효시간 동안 맘대로 쓰면 어캄 유효시간 아무리 짧아도 30 ~ 50분은 가져가잖아 리프레시 토큰 탈취당해서 엑세스 토큰 재발급 받는다던가
보안이 중요하면 액세스토큰 주기를 짧게 두면 될것이고리프레시 토큰이 탈취당하면 만료시키면 되는데 문제가 무엇임? 보안 극도로 중요하면 stateful한 세션을 쓰던지
유효시간 아무리 짧아도 30분 50분은 둔다는건 누구 생각임? 그런 규칙은 없음
보안이 극도로 중요한건 아닌데 토큰이 탈취된걸 뭘로 판단함? 리프레쉬 토큰이 유효성 검사하고 들어왔는데 reids에 없으면 블랙리스트로 등록하면 되나
탈취 감지는 뭔가 뻘짓을 하다가 이상함을 감지하던지 악성코드 검출에 걸렸든지 해야함
걍 오카방 오면 안됨?
https://open.kakao.com/o/s13NHEQe
오카방에서 뭔 내용 말했는지 정리해주기 가능?
Oauth2 기본은 클라의 신뢰가능한 저장소가 있어서 탈취가 엄청 힘들다는게 전제였던걸로 기억하는데
탈취는 전송 시점에서 주로 일어남