JWT 저장소로 cookie를 사용하나요?
안녕하세요.
json web token을 이용한 인증 구현 시 궁금한 점이 있어서 질문 남깁니다.
jwt 인증은 서버가 상태를 갖지 않기 때문에 따로 클라이언트 측에서 토큰을 저장해야 되는걸로 압니다.
크게 웹스토리지(로컬/세션스토리지)와 쿠키 2가지 저장소가 있구요.
로컬스토리지의 경우 손쉬운 js의 접근/조작으로 XSS 공격에 취약하고 CSRF 공격엔 안전하고
쿠키의 경우 httpOnly, secure, sameSite와 같은 옵션을 사용하면(이 경우 쿠키는 서버에서 생성) XSS 공격엔 안전하고 반대로 CSRF 공격에 취약하다고 알고 있습니다.
XSS 공격이 범위가 더 넓고 방어가 힘들기 때문에 쿠키에 저장하는걸 권장한다는 많은 글을 봤습니다. (물론 반대의 글도 많이 보긴했습니다... 어쩌라는거지;)
제가 내린 결론은 httpOnly, secure, sameSite flag가 적용된 쿠키를 저장소로 사용해야 된다 입니다.
물론 csrf 공격에 대비하기 위해 추가로 orgin/referer 검사, 이중 게시? 와 같은 대비책을 마련하구요.
실무에서는 어떤 방식으로 저장소에 저장하고 위험을 대비하나요?
추가로 여기 아하 사이트에서 크롬 개발자 도구로 쿠키를 보니 jwt 토큰을 쿠키에 저장은 해놓던데 단순 쿠키로 저장을 해놨더라구요 (httpOnly, secure, sameSite 없이)
그리고 api 요청을 할때 쿠키에서 토큰을 꺼내서 Athorization 헤더에 토큰을 실어 보내는거 같은데..
이 경우 보안상의 위험은 없나요? 아니면 추가로 뭔가 방어책을 마련해 둔건지..
jwt 인증을 처음 구현해보려고 여기저기 알아보고 구현하는 중이라 궁금증이 많습니다.
질문을 정리해보면
실무에서는 jwt 인증 구현 시 어떤 저장소에 저장을 하고 어떻게 위험을 대비하나요?
여기 아하 사이트는 jwt를 단순 쿠키(옵션 없음)에 저장을 하고 요청 시 마다 쿠키에서 꺼내서 Athorization 헤더에 토큰을 실어 보내는데 보안상의 위험은 없나요?
없다면 추가로 어떠한 방어책을 마련한건가요?
답변 부탁드립니다. 감사합니다!!
안녕하세요, 앰포 백엔드 개발자 김동현입니다.
일단 jwt를 발급하거나 해독할 때 secret키를 이용해 서버만의 시그니쳐를 갖게 되죠.
사실 저 secret키는 서버에만 두기 때문에 누군가 jwt를 가져간다고 해도 안에 내용을 열어볼 수는 없습니다.
다만 문제점은 제가 로그인 했을 때 발급받은 jwt를 복사해서 자신의 브라우저 쿠키에 넣으면 그 사람이 마치 저인 것 처럼 인증이 가능하게 됩니다. 이 부분이 가장 큰 문제점이라고 할 수 있겠네요.
실무에서도 아하 웹사이트 또는 여타 다른 서비스처럼 쿠키에 발급합니다. 말씀하신 쿠키 발급 시 httpOnly 등을 넣어주는 게 좋겠죠.
쿠키를 서버에 보내는 방식은 상관이 없습니다. 다만 위에서 말한 jwt를 자신의 쿠키에 넣어버리면 인증이 되어버리는 문제가 있습니다.
Token 만료를 한 시간 내외로 주면 사실 크게 문제가 되진 않지만, 사용자가 계속 로그인을 시도해야하니 굉장히 불편하겠죠. 그렇다고 만료를 길게 주자니 2번 같은 문제가 있죠. 그래서 저의 경우에는 사용자가 로그인 했을 때 위치나 기기 고유 값, 아이피 등을 저장해두고 너무 다른 위치에서 로그인이 시도될 경우 자신이 맞는지 다시 확인시킵니다. 구글이나 페이스북 처럼요.
답변이 도움이 되었으면 좋겠네요!