본문 바로가기

CS/네트워크

JWT

JWT(Json Web Token)란 Json 포맷을 이용하여 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰이다.

JWT 구조

JWT는 Header, Payload, Signature의 3부분으로 이루어지며, 각 부분은 .(점)으로 구분한다.

 

[JWT 구조 정보]

Header

토큰의 헤더는 alg와 typ 두가지 정보로 구성된다.
alg는 알고리즘 방식을 지정하며, 서명(Signature) 및 토큰 검증에 사용된다.
typ는 토큰의 타입을 지정한다.

 

Payload

토큰의 페이로드에는 토큰에 담을 정보를 지니고 있다. Key-Value 형식으로 이루어진 한 쌍의 정보를 Claim이라고 한다.

 

Signature

서명(Signature)은 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.

서명은 인코딩된 Header와 Payload를 더한 뒤 비밀키로 해싱하여 생성한다. Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, 서명은 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화는 할 수 없다.

따라서, 서명은 토큰의 위변조 여부를 확인하는데 사용한다.

장점

  1. 서명을 통해 데이터 위변조를 확인 할 수 있다.
  2. 인증 정보에 대한 별도의 저장소가 필요없다.
  3. JWT는 토큰에 대한 기본 정보와 전달할 정보 및 토큰이 검즘되었음을 증명하는 서명 등 필요한 모든 정보를 자체적으로 지니고 있다.

단점

  1. 쿠키/세션과 다르게 JWT는 토큰의 길이가 길어, 인증 요청이 많아질수록 네트워크 부하가 심해질 수 있다.
  2. Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다.
  3. 토큰은 한번 발급되면 유효기간이 만료될 때까지 계속 사용되어 탈취당하게 되면 대처하기 힘들다.

보안 전략

  1. 짧은 만료기간 설정
    토큰의 만료기간을 짧게 설정하여 토큰이 탈취되더라도 빠르게 만료되기 때문에 피해를 최소화할 수 있다. 그러나 사용자가 자주 로그인해야 하는 불편함이 생긴다.

  2. Refresh Token 사용
    클라이언트가 로그인 요청을 보내면 서버는 Access Token 및 그보다 긴 만료기간을 가진 Refresh Token을 발급하는 전략이다.
    Access Token이 만료되었을 때 Refresh Token을 사용하여 Access Token의 재발급을 요청한다. 서버는 DB에 저장된 Refresh Token과 비교하여 유효한 경우 새로운 Access Token을 발급하고, 만료된 경우 사용자에게 로그인을 요구한다.

    해당 전략을 사용하면 Access Token의 만료기간을 짧게 설정할 수 있으며, 사용자가 자주 로그인할 필요도 없고 서버가 강제로 Refresh Token을 만료시킬 수 있다. 그러나 검증을 위해 서버는 Refresh Token을 별도로 저장하고 있어야 하므로 이는 JWT의 장점을 완벽하게 누릴 수 없다는 단점이 존재한다.

'CS > 네트워크' 카테고리의 다른 글

프록시  (0) 2022.10.05
Scale Out & Scale Up  (0) 2022.10.05
토큰 기반 인증  (1) 2022.10.03
세션 (Session)  (0) 2022.10.03
쿠키 (Cookie)  (0) 2022.10.02