안녕하세요.
개인 프로젝트를 진행하던 도중 Jwt Token 관련 질문이 있어서 글을 남기게 되었습니다!
현재 서버로부터 Jwt Token을 받았습니다. (access-token 1개로만 구현해보려고 합니다.)
해당 토큰을 프론트에서 어떤 방식으로 저장을 하여 로그인한 사용자만 이용할 수 있는 서비스에 인증을 해주시나요?? 대체로 어떤 방법으로 쓰이는지와 그 이유가 궁금합니다!
검색을 하면서 찾아본 것은 아래 3가지 였습니다.
쿠키
setCookie("access-token", data.accessToken);
로컬스토리지
localStorage.setItem("access-token",data.accessToken);
헤더
axios.defaults.headers.common['Authorization'] = 'Bearer ' + res.data;
실제로 저기 세 개에 저장을 많이 합니다.
저는 일반적으로 3번을 추천합니다. 메모리에 저장하는 것이라 브라우저를 끄면 알아서 토큰 데이터가 날아갑니다. 1번과 2번은 3번에 비해 보안적으로 지켜야할 게 좀 있습니다. 로컬스토리지는 xss 공격에 의해 탈취되는 것을 막아야하고, 쿠키는 csrf 공격을 방비해야 합니다. 하지만 만약 유저 정보를 ssr을 해야하는 경우가 있다면 1번을 사용하시면 됩니다.
답글
dev kim
2023.09.08아하 자세한 답변 감사합니다!
한가지 더 궁금한 점이 생겼습니다..!
3번 방법이 sessionStorage와 동일한 기능이라고 봐도 될까요??
만약 동일하다면 3번 방법을 쓰거나 sessionStorage 이걸로 쓰거나 상관 없나요?
제로초(조현영)
2023.09.08sessionStorage랑도 비슷한 느낌입니다. 다만 sessionStorage는 메모리가 아니라 스토리지라서 스토리지만의특성이 있습니다. 메모리보다 좀 더 오래갑니다. 새로고침을 해도 남아있고요.
dev kim
2023.09.08앗하 넵! 답변 감사합니다!
혼자서 고민 많이 하고 있던 부분이였는데 도움 주셔서 감사합니다. 😭
dev kim
2023.09.11안녕하세요. 위 답변에 대해 한가지만 더 여쭤보겠습니다!
유저 정보의 ssr을 해야하는 경우의 말이 풀면.. 로그인 이후 유저의 정보를 확인하고 들어가는 페이지일 경우라는 말씀이신거죠??
const history = useNavigate();를 사용하여 로그인 이후 페이지 이동도 하고
로그인 한 이후 이동한 페이지는 무조건 로그인 한 유저인것을 확인한 다음에 접속할 수 있는 페이지 입니다!
그렇다면 3번이 아닌 1번 방법으로 해야하는거죠?
3번으로 하게 되면 결국 새로고침이나 페이지이동의 경우 헤더의 정보를 잃어버리게 된다고 이해를 했습니다! 이동한 페이지에서 유저를 확인하기 위해 토큰이 필요하다면 결국 토큰을 쿠키에서 가져온 다음에 다시 헤더에 넣어주는 방법을 생각하고 있습니다.
말씀하신 쿠키의 오류사항은 검색을 해보니 httpOnly를 쓴다면 방어할 수 있다고 하는데 이것또한 100% 방어는 아닌 것 같아서요! 이정도까지라도 충분한지.. 아니면 더 방어할 수 있는 방안은 refresh token까지 만드는것일까요..??
제로초(조현영)
2023.09.11네 쿠키를 써야지만 페이지 새로고침, 이동 시에도 서버에서 로그인 여부 확인이 가능합니다.
httpOnly를 해도 csrf 공격 당합니다. csrf 공격을 방어하세요. 리프레시 토큰이랑은 상관 없습니다.
dev kim
2023.09.11넵! 답변 감사합니다!
dev kim
2023.09.12안녕하세요! 한가지만 더 여쭤보려고 합니다 😭
쿠키의 httpOnly 옵션을 true로 할 경우에 쿠키가 저장되지 않고 httpOnly를 제외하면 쿠키가 저장되는 현상을 발견한 후 구글링하여 아래 글을 발견했었는데요..!
또 다른 글들을 보니 쿠키의 옵션에 domain을 'localhost'로 설정하고 httpOnly 옵션을 사용하는 것 같던데 저는 왜 안될까요.. 현재 로컬호스트에서 httpOnly 옵션을 true로 하여 테스트할 수 있는 방법이 없을까요?? 혹시 몰라서 아래 작성한 코드 추가합니다!
+그리고 클라이언트와 서버의 도메인을 사용하기 위해 cors 설정은 해놓았고 sameSite 옵션을 none 으로, secure 옵션은 ture로(이 옵션 때문에 클라이언트 로컬호스트는 https로 접속가능하도록 설정해놨습니다. http로도 시도해봤었습니다.)
layout.tsx
아래 getCookie로 가져와서 헤더에 넣어주고 싶었는데 호출하면 undefined만 나오고 있습니다..!
app.tsx
setUpProxy.js
제로초(조현영)
2023.09.12로컬호스트에서도 httpOnly 됩니다. 네트워크 탭을 보세요. 요청 응답 헤더에 set-cookie 들어있어야하고 설정 잘못한 경우 뭐가 문제인지 거기 다 나옵니다. set-cookie 자체가 없으면 서버에서 setCookie를 하는 코드가 이살한 겁니다.
dev kim
2023.09.12넵! 갑자기 되고 있어서..! 해결은 되었습니다. 답변 감사합니다!