React에서의 JWT 로그인 (accessToken, refreshToken)

saebyeol·2022년 9월 6일
2

저번 인턴 면접에서 왜 access Token으로만 로그인 연장을 구현하지 않고 굳이 refresh Token을 따로 만들어서 연장을 구현했냐는 질문을 받았다.
그냥 난 refresh Token은 로그인 연장을 위해 필요한 토큰이다 이정도로만 알고 있었어서 accessToken만으로도 구현할 수 있었을텐데 왜 따로 토큰을 또 만들었냐는 질문에 답할 수가 없었다...(정말 창피한 순간이었다..)
(이 질문에 대한 답은 "보안" 이었다.)
그래서 JWT에 대한 개념을 다시 제대로 짚고 가려한다!

  1. JWT 인증 과정
  • 먼저 JWT토큰에 대해 설명하자면 유저를 인증하고 식별하기 위해 사용되는 토큰으로, 세션과는 달리 서버가 아닌 클라이언트에 저장된다.

1) 토큰 발행 (로그인)

  • 클라이언트가 id, pw를 서버로 보내면
  • 서버는 DB에서 유저정보의 유효성을 체크
  • 유저 정보 중 일부를 JWT body에 넣고 토큰 발행하여 클라이언트에 보냄

2) 토큰 검증

  • 클라이언트는 HTTP header에 토큰값을 넣어서 보냄
  • 서버는 토큰값을 받아서 JWT 정보와 서버가 가지고 있는 secret key를 이용해서 서명을 만들고 유효한 토큰인지 아닌지 check
  1. accessToken, refreshToken
  • refreshToken은 긴 유효기간을 가지며 accessToken이 만료됐을 때 새로 발급해주는 열쇠의 기능을 한다.
    1) 굳이 refreshToken을 사용하는 이유?
    -> accessToken을 통한 인증방식의 문제는 제 3자에게 탈취당할 경우 보안에 취약하다는 점이다.
    JWT토큰을 사용한 인증방식은 서버에서 통제가 불가능하며 토큰의 유효성만을 판단하여 동작하기 때문에 서버에 부담이 가지 않고 확장성이 뛰어나다는 장점이 있지만 보안적으로는 취약하다.
    따라서, 이렇게 단일토큰을 사용하는 경우 해당 토큰이 탈취당했을때 서버에서 손 쓸 방법이 없는 것이다..
    -> 그렇게 때문에 서버측에 따로 refreshToken을 저장해두어(stateful) refreshToken이 탈취당했다고 판단되었을 때 서버에서 refreshToken을 삭제함으로써 강제 로그아웃 시킬 수 있다.
  • 여기서 들 수 있는 의문
    1) accessToken 하나만 사용하되, 지속시간을 짧게 하면 단일토큰만으로도 보안성을 강화할 수 있지 않을까?
    -> 이 경우 사용자가 빈번히 로그인을 해야하는 상황이 되고 불편함을 느낄 수 밖에 없음.
    2) refreshToken이 탈취당한다면?
    -> 이 경우에는 서버측에서 refreshToken을 삭제하여 문제 해결이 가능하기 때문에 accessToken이 탈취되었을때보다 훨씬 안전

따라서, 보안적으로 취약한 accessToken은 2시간 정도로 지속시간을 짧게 잡고 , refreshToken은 처리비용이 많이 들기때문에 2주정도로 긴 지속시간을 갖도록 한다.

profile
프론트엔드 개발자

0개의 댓글