-
JsonWebToken - Access Token과 Refresh TokenJsonWebToken 2021. 2. 16. 16:10
이전의 글인 Jwt에 대한 설명에 부가적인 내용을 다룰 포스팅입니다.
매우 주관적인 생각도 들어가 있으니 피드백은 얼마든 환영합니다 ㅜ
Access Token에 대해서 이전 글에서 설명했지만, 다시 간략하게 설명하자면
서버에서 사용자의 인증을 위한 정보를 포함한 토큰으로, 사용자는 API 요청할 때마다 HTTP 헤더에
Access Token을 담아 전송하게되고 서버는 이 토큰을 검증해 사용자 인증을 해 API요청에 대한 응답을
사용자에게 전송하게 됩니다.
하지만 이 Access Token은 탈취될 우려가 존재하며, 한번 발급된 토큰에 대해 서버는 강제력을 행사할 수 없다는 단점이 존재하는데요, 이를 보완하기 위해 Access Token의 만료기간을 짧게 설정하고, Refresh Token이란 별도의 토큰을 생성해 Access Token이 만료될 때마다 Refresh토큰을 통한 검증으로 새로운 Access Token을 발급해 사용자에게 전달합니다.
간단하게 예를 들어보자면 사용자 A는 보안의 강화를 위해 만료기간이 30분인 Access Token을 가지고 있습니다.
사용자 A는 30분 동안은 마음껏 서비스를 이용할 수 있지만 , 30분이 지나 토큰이 만료된다면 서비스를 이용할 수 없게되므로 다시 로그인을 진행해야 하는 것인데 이는 사용자 입장에서는 아주 불쾌한 경험이 될 것입니다. 어떤 글을 작성하던 중이거나 할 때 로그인 창으로 넘어가버리면 끔찍하겠죠 ?
Refresh Token을 도입하게 된다면, 사용자 A는 만료기간이 30분인 Access Token과 만료기간이 2주인 Refresh Token을 가지고 있고, 사용자 A는 30분이 지나 토큰이 만료되어도 서버에서 Refresh Token을 통해 새로운 Access Token을 발급해 사용자에게 전달해주기 때문에 다시 로그인 할 필요성이 없어 사용자 경험의 질이 매우 상승할 것입니다.
Refresh Token을 통한 인증 과정
출처 : https://tansfil.tistory.com/59?category=255594 이전 포스팅에서 다룬 Access Token만을 사용한 과정과는 사뭇 다르며 더 복잡해보이죠?
동작과정을 설명하자면,
1 - 사용자 로그인
2 - 1번에서 전달받은 데이터를 DB의 회원 정보와 일치하는지 검증
3 - 2번에서 검증되었다면 이를 통해 Access Token과 Refresh Token을 발급
4 - 사용자에게 Access Token, Refresh Token을 전달
5 - 사용자는 Access Token을 포함해 서버에 데이터 요청
6 - 5번에서 전달된 Access Token을 검증
7 - 6에서 검증되었다면 사용자가 요청한 데이터에 맞는 응답
8 - Access Token이 만료되었을 때.
9 - 사용자는 Access Token을 포함해 서버에 데이터 요청
10 - 9번에서 전달된 Access Token을 검증
11 - Access Token이 만료됨을 알림
12 - 요청 헤더에 Refresh Token을 포함해 Access Token 재발급 요청 ( AccessToken은 같이 전송 안해도 된다고 생각)
13 - 12번에서 전달된 Refresh Token을 검증 후, 검증 되었다면 새로운 Access Token 재발급 후 사용자에게 전달
그 후 사용자는 새로 발급된 Access Token을 통해 다시 서비스를 사용할 수 있다 라는 시나리오로 구성되어 있습니다.
장점
- 기존 방식인 Access Token만을 사용해 인증하는 것보다 안전하게 사용할 수 있습니다.
단점
- 아무래도 구현해야 할 것이 늘어났기에 구현이 좀 더 복잡합니다.
- 토큰 만료 후 재발급되는 과정에서 요청이 많을 수 있어 서버의 자원을 낭비할 가능성이 있습니다.
간단하게 정리하자면 이렇게 마무리를 할 수 있을 것입니다.
하지만 저는 좀 모호하다고 생각하는게
보안 강화를 위해 Refresh Token을 사용하는 것인데,,
저는 잘 모르겠습니다 공부를 하면서 느낀점은 Refresh Token의 필요성은 알겠으나, 여러곳에서 본 글에 의하면
이 Refresh Token이란 것을 '안전한 저장소'에 저장한다고 하는데 이 '안전한 저장소'라는 개념을 잘 모르겠고
처음에 생각했을 땐 클라이언트에서 Access Token과 Refresh Token을 둘 다 가지고 있으며, Access Token을 서버로 전송한 뒤 만료됨을 확인했을 때 Refresh Token을 전송해 새로운 Access Token을 발급한다? 라고 생각했으나
이렇게 한다면 Access Token이 탈취된다면 Refresh Token또한 탈취되는 것이 아닌가 하는 생각이 들게 되었고 다른 방법을 생각하던 중 Refresh Token을 Redis와 같은 별도의 저장소에 저장한다면 탈취될 우려는 매우 줄어들게 되겠지만 Stateless와 별도의 저장소가 없다는 장점을 무시하게 되는 것 같고, 잘 모르겠네요 DB에 저장을 해야할지,,
정보를 전달하는 블로그에서 명확하게 알지 못한 상태에서 글을 쓰는게 죄송스럽네요. 혹시 정확한 정보를 아신다면 댓글에 적어주시면 감사하겠습니다!
'JsonWebToken' 카테고리의 다른 글
JsonWebToken -Jwt란? (0) 2021.02.16