이전에 회사 내부에서만 쓰이는 프로젝트에 jwt 로긴 만든적이 있음
솔직히 내부에서만 쓰는거라 크게 신경 안쓰고 쿠키에 한달짜리 토큰 하나만 저장하는식으로함
이때 내가 이해한 기본적인 개념은
해킹 우려때문에 jwt 토큰은 httponly 쿠키로만 저장한다라고 알고있음
근데 이번엔 외부에 공개된 로긴을 하나 만들어야하는데
예전부터 들었던 엑세스랑 리프레시 적용을 하려고함,
개념은 알고있는데 인터넷에 암만 찾아봐도 실제로 구현한 예제는 없더라
누가 써놓은거 퍼나르고 퍼날라서 이곳저곳 개념설명한 글은 많은데 정작 실제로 만드는건 절대 안보여줌
아무튼 내가 이해한 개념으로는
1. 로그인시 액세스 토큰,리프레시 토큰 두개를 받는다
2. 리프레시는 저장해두고 요청할때는 액세스 토큰만 쓴다
3. 만약 액세스 토큰이 만료 됬으면 리프레시 토큰으로 갱신하는 요청을한다
이렇게만 알고있는데 이걸 실제로 구현 하려니까 리프레시 토큰을 어디다 저장하라는지에 대한 답이 죄다 제각각이라는겅미
첫번째로 토큰을 브라우저 localstorage에 처넣으라는거는
httponly에만 저장하라던거랑 말이 완전히 다르고
두번째는 둘다 httponly 쿠키로 저장하는건데 이러면
어짜피 털리면 둘다 털릴께 뻔한데 토큰 하나만 썻을때랑 무 슨 차이가 있냐는거고
마지막으로 세번째는
리프레시를 백엔드에다 저장하는건데
이러면 애초에 백엔드에서 로긴상태를 저장안하려고 jwt 도입한 의미가 없어지는건데
이짓을 왜하는지 이해가 안함
오늘 하루종일 이거 관련해서 찾아보다가
결국 돌고돌아서 위에 3가지 내용만 계속 처보고 있었음
뭔가 실제로 쓰인 예제라도 찾았으면 하는데 안보임
뭐가 정답인가여?
localStorage는 js 단에서 접근이 가능하므로 httponly 쿠키에 저장하는 것보다 xss 류 공격에 더 취약함
결론은 두 토큰 다 httponly 쿠키에 넣으라는 건가요 모바일 앱하고 같이 서비스하는 경우에도 그래도 되는건지 궁금하네요
https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html
아니다 owasp 확인해보니 csrf 고려하면 httonly보다 localStorage가 낫네 위 링크 참고해서 localStorage 같은 곳에 넣되 fingerprint 넣는 게 맞을듯 ㅈㅅㅈㅅ
httponly: xss에서 쉽게 토큰을 가져갈 순 없지만 csrf류의 공격에 취약. localStorage: xss에서 쉽게 토큰을 가져갈 수 있지만, 개발자가 원하는 상황에서만 토큰이 전송되므로 csrf류의 공격이 발생하지 않음. 토큰이 탈취되는 문제는 토큰에 핑거프린트를 추가하는 방법으로 막을 수 있으므로, localStorage를 사용하는 것이 더 낫다 이렇게 되는듯
https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/
봤을지도 모르겠지만 좋은 글이여서 참고하는것도..
막상 쓸때는 httponly cookie + csrf 토큰 정도가 많음 로컬스토리지는 ssr을 못걸어서 못쓰는 상황이 생김 - dc App
결국 두번째 방법대로 httponly에 액섹스랑 리프레시 둘다 저장하는건 의미 없다는거져? 그냥 토큰하나만 자동 갱신되게 해도 되려나
그래두됨 토큰 로테이션 - dc App
리프레시 쓰는건 보안 측면이라기 보다는 ux때문에 그런거 아니었음??(진짜 몰라서 그럼)
토큰 저장 장소 나올 때마다 로컬 스토리지는 XSS에 취약하다 그러는데 쿠키에 저장한다 쳐도 XSS 뚫리면 걍 fetch 써도 쿠키 그대로 날라가는 거 똑같은 거 아님? 이해가 안 됨
토큰 자체를 탈취하는 일은 없겠지만 해당 사용자 입장에서 이것저것 지지고 볶을 수 있다는 점에서 로컬 스토리지에 토큰 저장하는 방식이 XSS에 특별히 더 취약하다고 말하는 게 큰 의미가 있나 싶음
domain 이라는게 잏어요
https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#domain_attribute
이거?
cors로 도메인이 다르면 쿠키 전송등에 제한이 붙음. - dc App
내 얘기는 공격자 서버로 토큰 탈취는 안 되겠지만 XSS 뚫리면 예를 들어 회원탈퇴 API 이런 거 그냥 쏠 수 있는거 아니냔 거임
ㅇㅇ 맞음 그래서 비번 재입력하라고 하는거임 - dc App
근데 애초에 회원탈퇴 페이지를 따로만들고 수명짧은 인증토큰을 보내서 토큰까지 같이 보내지않으면 탈퇴안되게하는게 일반적이지 않을까함 - dc App
토큰에 대해서 이해 못한듯. 엑세스는 인메모리에 가지고 있는게 맞음 리프레쉬하면 날라가게 그래서 리프레쉬 토큰 여부를 확인해서 엑세스 토큰을 발급받는거지 리프레쉬의 경우 http only로 가지고 있는게 그나마 가장 안전함
인메모리에 갖는건 SPA에서나 가능할법한 이야기 아님..?