Search

JWT(Json Web Token)

태그
JWT
2주차
목차

JWT 의 등장

웹시장의 규모가 커지면서 웹 서비스가 핸들링 해야하는 규모 또한 커졌습니다.
또한 로그인 횟수 등이 유저에게 큰 불편함을 주었고, 이는 결국 유저 이탈 등의 비용적 손해로 직결되었습니다.
서비스 인식 / 재방문 감소
원활한 서비스 운영을 위한 (= 수익, 비용) 발전 과정에서 나온 대안입니다!

JWT

JWT 는 우리가 담고싶은 정보(유저id, 권한, 인증 등)와 만료 정보가 있습니다.
때문에 DB에 저장하고 읽고 비교하는 로드가 사라졌습니다.
단순히 특정 알고리즘 과 Key 로 토큰을 열어 어떤 유저인지, 만료 되었는지 체크할 수 있습니다.
하지만 기존 Token 때와 마찬가지로 일정 기간이 지나면 만료가 되어 유저가 재로그인 해야하는 이슈는 여전했습니다.
JWT 만료 기간을 무한대로 늘리면 탈취, 유출 되었을 때 위험성이 커집니다.
반대로 만료기간을 작게하면 유저의 로그인 주기가 짧아지게 됩니다.

인증서버와 자원서버

웹시장의 발전으로 더욱 많은, 다양한 서비스를 제공하게 되었습니다.
서버가 다중화 되어 로드를 분산수행합니다.
같은 기능의 서버를 로드밸런싱을 통해 다중 제공 합니다.
MSA 를 통해 서비스를 작은 단위의 여러 서비스로 제공합니다.
하지만 모든 서버와 MSA 들이 JWT 를 발행할 줄 알아야 할까요?
요즘에는 유저 인증에 관여하는 인증 서버와 로직을 수행하는 자원 서버로 분리합니다.
또한 외부 인증서버를 활용하여 인증서버 역할을 위임하고, RESTful API 개발에만 몰두 합니다. (+ 안정성)
카카오 로그인
네이버 로그인
구글 로그인
AWS Cognito

Refresh Token 의 등장

JWT 만료 기간을 짧게 줄이고, 유저가 로그인을 인지하지 못하게 하자!
AccessToken = 30 초, 5 분 ~ 60 분, 1 일
RefreshToken = 30 일
Access Token 기한은 서비스 중요도에 따라, 알고리즘 별 해킹 시간이 다르니 이 또한 고려해야 합니다.
Refresh Token 의 등장으로 인해 Access Token 의 만료 시간이 짧더라도 유저는 이를 인식하지 못합니다.

Refresh Token 이 탈취 되면?

1. 인증서버 - RT 발행 및 저장(DB) - AT 발행 2. 클라이언트 - RT 저장(Store) - AT 저장(Store) 3. 자원서버 - 클라이언트 요청 Header 에서 AT 검증하여 응답 4. 클라이언트 - AT 만료 시(401) - 인증서버에게 RT 로 AT 재발급요청 5. 인증서버 - 재발급 요청한 RT 및 DB에 저장된 발급자 정보를 통해 유효한지 검증 후 AT 재발급
Markdown
복사
Access Token 탈취 당하면 만료 전까지 (30분 등) 마음대로 사용 가능하겠지만 Refresh Token 를 탈취 하더라도 이는 인증서버에서 검증하는거라 더 수준높은 보안을 적용할 수 있습니다.
예시 어제 집에서 디스코드 사용하다 오늘 스타벅스에서 디스코드를 키면 Access Token 이 만료되었으니 Refresh Token 로 재발급 요청을 하라고 합니다. 하지만 해당 Refresh Token 는 집 ip 로 발행된거라 스타벅스 ip 에서는 Refresh Token 못쓰니 재로그인을 해야 합니다.
예시 구글 로그인의 경우 RT 유효성 뿐만이 아니라 허용된 디바이스 목록에 있어야만 로그인이 가능합니다. 허용된 디바이스 에서 새 디바이스를 허용해야 합니다.