JWT Comment
JWT는 암호화되지 않는다. base64로 인코딩 되고 서명된다. 따라서 누구나 토큰을 해독하고 해당 데이터를 사용할 수 있다.그렇다면 JWT를 어디에 저장하는 것이 좋을까?전통적으로 Local Storage와 Cookie 간 의견이 많이 갈렸다.
Http Only : 쿠키를 JS 에서 접근 못하게 막아주는 flag?
Secure: Https 가 아닌 상황에서 쿠키 전송 X
두개 용어를 혼재해서 사용합니다. 양해 부탁스
Refresh Token은 항상 Secure Cookie에 담겨야 한ㄷㅏ.
Local Storage
장점
- 편리하다! 접근이 쉽다.
- CSRF 공격으로부터의 위협은 거의 없다.
단점
- XSS 공격에 매우 취약하다.
- JWT 탈취 위협이 매우 크다.
Cookie (Secure 쿠키 기준)
장점
- Local Storage에 비해 XSS 공격으로부터 안전하다.
- JWT 탈취 위협이 거의 없다.
단점
- Local Storage에 비해 안전하지만 여전히 XSS 공격에 취약하다.
- CSRF 공격에 취약하다
Secure 쿠키를 사용해도 마찬가지. 적절한 CSRF 완화 전략이 필요하다. SameSite 쿠키나 Anti-CSRF Token은 CSRF 공격으로부터 안전하나?
나름 최선의 전략
JS memory
js memory에 access token 을 저장한다.그리고 refresh token을 cookie에 저장한다.
장점 : 보안상 위의 방식들에 비해 확실하게 안전하다.
단점 : 새로고침시 새로 발급을 받아야 하여, 서버에 오버해드가 발생할 수 있다. 근데 이거에 대해 언급하는 문헌이 없는거 보니 큰 오버헤드는 아닌 것 같다.
사담
홍성빈
jwt는 서버에서 유저를 식별하기 위한 key 용도로만 사용한다고 생각하기 때문에 클라이언트 측에서 jwt를 디코딩하여 유저 정보를 추출하기 보다는 별도로 유저 정보를 요청하는 api를 제공하는 것이 적절하다고 생각한다.
로컬스토리지와 쿠키를 사용하는 것은 각자의 장단점이 있기 때문에 개발자의 취향이라고 생각하지만 개인적으로는 쿠키를 사용하는 편이 좋다고 생각한다. 쿠키를 사용할 경우 클라이언트 측에서 요청을 보낼 때마다 헤더에 JWT를 포함하는 별도의 작업을 할 필요가 없고, CSRF 공격으로부터 취약해지더라도 쿠키의 same-site 옵션을 통해 어느정도 타협을 볼 수 있다(동일한 도메인을 사용한다는 전제 하에).
차재명
jwt를 프론트에서 암호화해서 로컬 스토리지에 저장한다?문제점 : bundle.js에서 리버싱 가능
은승균
JWT는 언제든 탈취당할 수 있다는 점을 감수하고 사용해야 한다고 생각함. 어떤 방식이든 장단점이 존재하기 때문에 JWT에는 최소한의 정보만 담고 매번 요청을 통해서 정보를 주고받으며 진행해야한다고 생각함. 그럼에도 이중으로 암호화를 진행하여 주고받게 된다면 나름 안전하지 않을까라는 생각
박상혁
단순히 어떤 한 방식이 무조건 옳다기 보다는 상황에 맞게 사용하는 것이 좋은 것 같다. 로컬 스토리지가 보안 면에서 가장 안좋다고 해도 사실 access Token의 짧은 수명이 jwt의 탈취 가능성을 염두에 두고 설정한 거라 큰 의미가 없다고 느낄 수도 있고, 보안을 굉장히 우선시해서 memory에 저장하는 방식을 애용할 수도 있는 것이다.
참고 자료
https://hasura.io/blog/best-practices-of-using-jwt-with-graphql/http://daplus.net/security-jwt를-localstorage-또는-쿠키에-저장해야합니까-복제/https://velog.io/@0307kwon/JWT는-어디에-저장해야할까-localStorage-vs-cookiehttps://hshine1226.medium.com/localstorage-vs-cookies-jwt-토큰을-안전하게-저장하기-위해-알아야할-모든것-4fb7fb41327c