항해99 개발일지

JWT인증, Access, Refresh token에 대하여

변기원 2022. 5. 15. 04:34

진행중인 너나들이 프로젝트 현재 로그인 기능은 소셜로그인(카카오, 구글)과 JWT로그인 인증 방식을 사용하고 있습니다

우리는 Access token만 사용해서 jwt인증을 구현해놨는데

기술멘토님께서 Refresh token까지는 무조건 하는거라고 하셔서 한번 적용해보려고 합니다.

 

access token 과 refresh token 의 개념을 이해하기 위해 jwt인증이 무엇인지, 그 전에 쿠키와 세션은 무엇인지에 대해서 

이해하면 좋을것 같습니다.

https://inpa.tistory.com/559

 

[WEB] 📚 JWT(Json Web Token )란? 💯 이해하기 쉽게 정리

Cookie & Session JWT 토큰을 배우기 앞서 쿠키와 세션에 대한 개념이 있으면, 토큰이 왜 사용이 되는지 ..등 보다 명확히 이해가 될수 있을 것이다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을

inpa.tistory.com

https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT

 

[WEB] 📚 Access Token & Refresh Token 원리 (feat. JWT)

선행 학습 [WEB] 📚 JWT(Json Web Token )란? 💯 정리 Cookie & Session [WEB] 🌐 세션/ 쿠키 🍪 정리 비연결성(Connectionless)과 비상태성(Stateless) HTTP 프로토콜에는 비연결성(Connectionless)과 비상태성(..

inpa.tistory.com

위 블로그를 참고하여 이해한 내용을 정리하겠습니다.

1. 필요한 이유

리프레시 토큰에 대해 알아야 하는 이유는 보안입니다. jwt엑세스토큰은 서버에 저장되지 않는.. 말그대로 JSON 형태로 인증에 필요한 정보를 암호화 시킨 토큰입니다. 서버에 저장되지 않기 때문에 stateless하다는 특성이 있고, 그렇기 때문에 만약 탈취당하게 되어서 공격자가 엑세스 토큰을 가지고 주인 행세를 할 수도 있다고 합니다. 만약 순조로운 사용자경험을 위해 엑세스 토큰의 만료일을 1주일 2주일 설정하게 된다면 그만큼 위험에 노출되는 기간이 길어지게 됩니다. 최대 2주일동안 주인행세를 할 수도 있겠죠?

그래서 엑세스 토큰의 만료시간을 1시간 2시간 정도로 짧게 잡아서 만약 탈취 당하더라도 금방 알아차릴 수 있게 하는 것 같습니다.

 

즉 애초에 탈취당하지 않도록 보안을 철저히 하는것이 좋지만! 100% 라는 것은 없기에 혹시모를 사태에 대비해 최악의 상황에도 적절히 대응할 수 있는 최소한의 안전장치 같은 느낌..?

그럼 사용자가 1시간마다 다시 로그인을 해야되는 상황이 발생합니다. 아주 불편하기 때문에 이때 필요한 것이 Refresh token 입니다!

 

2. Refresh Token 인증과정

저희 프로젝트에 적용되어 있듯이 기존에는 access토큰만을 발급받고 만료일을 길게 정해놨습니다. 서비스를 이용하는데 전혀 문제가 없을 정도로요! 하지만 보안강화를 위해 위처럼 refresh토큰을 추가해서 발급합니다. 백엔드에서 두개의 토큰을 발급해주면 리프레시 토큰을 안전한곳에 저장해놓고 엑세스 토큰으로 기존과 같이 http통신을 할때 헤더에 실어 통신을 하면 됩니다. 이때는 아마 보안강화를 위해 access 토큰의 만료일이 대폭 짧아진 상태겠지요? 유저가 서비스를 사용하던 중간에 토큰이 만료되면 직후의 http요청에 백엔드쪽에서 응답이 올겁니다. access토큰이 만료되었고, 당신의 요청에는 권한이 없습니다.

이번에는 access token과 함께 refresh token도 함께 보냅니다. 그러면 서버는 refresh토큰을 db에 저장된 정보와 비교합니다. 같은 유저인것이 확인되면 새로운 access token을 발급해서 다시 헤더에 실어서 response를 보내게 됩니다. 이후로는 이 과정을 반복합니다.

 

무슨 의미인지, 어떤 과정을 거치는지 이해했으니 코드를 보고 서비스에 적용해보도록 하겠습니다~!