token 값 탈취 피해를 최소화 해보자

김민섭·2022년 11월 28일
0

이 글을 쓰는 이유

나는 현재 수강중인 부트캠프 항해99의 실전 프로젝트에서 로그인과 마이페이지,webRTC, 노드 스케쥴을 이용한 휴면처리와 탈퇴처리 등등 을 맡고 있다.

그 중에서도 로그인 파트, 특히 Access Token과 Refresh Token은 사이트의 보안과 관련이 있다 보니 더욱 신경쓰게 되는 것 같다.

팀원들과 논의한 결과 Access Token이 탈취당했을 때의 위험성 때문에 Refresh Token을 같이 사용해 보자고 해서 두 개의 토큰을 사용하고 있는데 문득 Refresh Token이 탈취되면 어떡하지? 라는 생각이 들었다.

그래서 Token이 탈취 되었을때 피해를 입지 않을 수는 없겠지만 피해를 최소화 하는 방법을 생각해봤다. 그리고 생각해본 내용을 이 글에 정리해 보려고 한다.

Access Token만 사용할 때의 문제점, Refresh Token을 사용하는 이유

현재 우리 팀은 유저의 인증 수단으로 jwt를 쓰고 있다.

jwt의 특성상 토큰이 유효한지와 자신이 서명한 token이 맞는지만 확인을 하기 때문에 토큰이 탈취 되었을 경우 토큰이 만료되기 전까지 누구나 사용자의 개인정보에 접근을 할 수가 있다.
또한, jwt는 복호화가 쉽기 때문에 누구나 token의 payload에 들어있는 정보들을 확인할 수 있다.

이러한 문제점을 해결하기 위한 방법으로
1. payload에는 민감한 개인정보들을 담지 않는다.
2. token의 유효기간을 최대한 짧게 해서 피해를 최소화 한다.

이러한 2가지 방법이 있다고 생각한다. 하지만 두 번째 방법을 쓰게되면 token의 유효기간이 짧은 만큼 사용자는 잦은 로그인을 하게 될테고 그러한 과정들은 유저로 하여금 만족스럽지 않은 경험을 하게 만든다.

여기서 등장하는 것이 Refresh Token이다.
통신 과정은
1. 유저가 로그인을 하면 유효기간이 짧은 Access Token과 긴 유효기간의 Refresh Token을 만든 후 FrontEnd에게 두 개의 토큰을 전달한다.
2. Access Token으로만 통신을 하다가 만료가 되면 AccessToken과 Refresh Token을 약속된 경로로 재발급 요청을 한다.
3. 발급한 RefreshToken이 유효하다면 새로운 AccessToken을 재발급 한다.

이러한 방식을 통해 Access Token을 짧은 유효기간으로 설정하더라도 유저가 자주 로그인을 하지 않게 만드는 것이다.

Refresh Token이 탈취당했을 경우

Refresh Token이 탈취 당했을 경우 유효기간이 긴 만큼 큰 피해가 발생할 것이다.
내가 생각해본 방법은 DB에 발급한 Refresh Token을 저장해서 만료시킬 수 있는 방법을 마련하는 것이다.

전제 조건) Refresh Token을 DB에 저장 후 받은 Refresh Token과 비교하여 일치할 때만 Access Token을 재발급 해준다.

1) 사용자가 직접 만료시키는 API를 만드는 것

  • 예를들어, 사용자가 해킹이 의심되었을 경우 계정이 다른 곳에서 사용되는 것 같아요 라는 페이지에 들어와서 Refresh Token을 만료시킬 수 있게 유도하는 것이다.
    그렇게 하면 DB에는 해당 Token 값이 삭제될 것이고 탈취당한 Refresh Token은 사용할 수 없게 되기 때문이다.

2) 비밀번호를 변경할 때마다 기존에 발급된 Refresh Token을 DB에서 지운 후 새로운 Token으로 재발급 한다

코딩 초짜의 생각

코딩 공부를 한지 이제 10주차가 되는 새싹인지라 위의 방법들 외에는 생각을 해낼 수 없었다. 학교를 다닐 때에는 그렇게 공부가 싫었는데 코딩 공부는 왜 이렇게 재미있는 지 모르겠다. 다음에는 해커들이 토큰을 어떻게 탈취하는지에 대한 방법도 알아봐야겠다.

profile
getting ready to run

0개의 댓글