jwt 적용기

팀프로젝트에서 jwt를 어떻게 적용했는지 소개합니다

팀프로젝트에서 jwt를 적용했습니다. 왜 적용했고, 어떤 방식으로 토큰을 관리하는지에 대해 소개합니다.

왜 JWT ?

세션보다 DB조회를 한번 덜 한다는 장점이 있어서 jwt를 적용했습니다.

jwt 방식은 token자체에 유저 정보를 넣을 수 있기 때문에 DB조회를 최소 한번은 줄일 수 있습니다.

어떻게 사용하고 있나요?

  1. 사용자가 로그인을 합니다
  2. 서버에서 인증을 하고, access token을 발급합니다.
  3. access token을 받아서 localStorage에 저장합니다.
  4. 인증이 필요한 api요청을 보낼때마다 header에 담아 보냅니다.
  5. 서버는 header에 있는 access token을 바탕으로 신원확인을 하고 요청을 처리해 줍니다.

refresh token은 왜 안썼나요?

보통 access token은 기간을 짧게 잡고, refresh token은 길게 잡습니다. 그리고 access token의 유효기간이 만료되면 refresh token으로 재발급 요청을 합니다.

하지만 저희는 생각했습니다. ‘access token의 유효기간을 길게 가져가면 되는거 아닌가?’ 하지만 이런 반론도 나왔습니다.

만약 access token이 탈취된다면?

저희는 현재 https를 쓰고 있고, 여기에 더해 httpOnly 옵션을 설정하고 cookie에 담으면 탈취당할 일이 없다고 판단했습니다.

만약에 이렇게 해도 탈취 할 수 있는 해커라면 refresh token도 충분히 탈취할 수 있다고 생각했습니다.

그래서 refresh token을 사용하지 않았습니다.

피시방에서 로그아웃을 깜빡한다면?

맞습니다. 이런 문제가 있습니다. PC방에 가서 로그아웃을 안하고 나온다면, 혹은 공용 컴퓨터에서 로그아웃을 안하고 집에 가버린다면?

악의적인 사용자는 1달짜리 access token을 갖고 이것저것 계속 할것입니다.

그래서 저희는 access token의 유효기간을 30분으로 완전 단축했습니다.

그러면 사용자가 30분마다 로그인을 해야 하는건가요?

맞습니다. 그런 문제가 있습니다. 그래서 저희는 유효기간을 30분으로 하되, 만료 5분전 부터 사용자의 입력 이벤트가 있으면 새로 갱신해 주는 방식을 선택했습니다.

setInterval로 갱신해주는 방법은 어떤가요?

이렇게 하면 사실 계속 갱신을 해주는것과 마찬가지라서 아까와 같은 문제가 됩니다.

악의적인 사용자가 계속 마우스를 붙잡고 있는다면요?

이거는 정말 어쩔 수 없습니다. 사용자의 책임이라고 생각합니다. 로그아웃을 생활화 합시다!!

글을 쓰다가 생각에 잠겨 30분이 지나면 어떡하나요?

저희 서비스는 매 10분마다 임시저장해줍니다! 다만, 정말 간혹 인증이 만료되서 글이 날아갈 가능성도 있네요. 이 부분은 “로그인을 연장하시겠습니까?” 하는 메세지를 띄워주는 방식으로 해결해야 할것 같아요.

access token을 사용자에게만 주면 서버에 제어권이 없네요!

맞습니다. session방식이라면 서버에서 전체인원을 로그아웃 시킬 수도 있겠지만 저희는 access token을 사용자에게 주기 때문에 제어권이 없습니다. 다만 저희 서비스에서는 거기까지는 필요하지 않아서 괜찮습니다.

이상입니다. 읽어주셔서 감사합니다 😀

Leave a Reply

Your email address will not be published.