JWT가 무엇일까?JWT가 무엇일까?JWT가 무엇일까?JWT가 무엇일까?JWT가 무엇일까?J

김태환·2023년 6월 27일
post-thumbnail

JWT (Json Web Token)

JWT란 무엇인가?

JWT는 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격이다.

JWT는 어디에 사용하는가?

주로 사용자의 인증 정보를 서버(백엔드)와 클라이언트(프론트엔드)가 서로 안전하게 주고 받기 위해 사용된다.

즉, 서비스 사용자의 로그인 과정에 주로 사용이 된다.

JWT은 보통 웹에서 Authorization HTTP 헤더header를 Bearer <토큰>으로 설정하여 클라이언트에서 서버로 전송되고, 서버는 토큰에 포함된 서명 정보를 통해 위변조 여부를 검증한다.

이 때, JWT는 eyJ로 시작하는, Base64로 인코딩encoding(암호화)된 문자열 형태이다.

JWT 구조

JWT = 헤더header.페이로드payload.서명signature 구조이며, 이를 암호화하여 전송하는 것이다.

ex) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

헤더header에서는 암호화에 사용한 해시 알고리즘과 토큰의 타입(종류)을 정의할 수 있다.
ex)

   "alg": "HS256",
   "typ": "JWT"
}

페이로드payload에서는 전달하려는 데이터(사용자의 인증 정보, 접근 권한, 토큰의 유효기간 등)를 포함한다.

서명signature에서는 위 완성된 헤더와 페이로드를 서버의 비밀 키(암호화에 추가할 salt값(secret))와 헤더에서 지정한 알고리즘을 사용하여 해싱(암호화)한다.

HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);

위 코드와 같이 해싱하면 서명이 완성되며, 이를 통해 토큰의 무결성을 보장할 수 있다.

서버에서는 헤더, 페이로드를 다시 암호화해서 받은 서명과 같으면 검증이 된 유효한 토큰으로 인식한다.

토큰의 종류

  • Access Token: 서버에 접근하기 위한 토큰.

    보안을 위해 보통 24시간 정도의 짧은 유효기간을 설정한다.


  • Refresh Token: Access Token 재발급용 토큰.

    보통 Access Token보다 유효기간을 길게 설정한다.

토큰 인증 방식 장점

  • JWT 이전에는 웹에서 쿠키cookie와 세션session을 이용한 사용자 인증이 많았으나, 서버에서 로그인한 모든 사용자의 세션을 DB나 캐시에 저장하여 쿠키로 넘어온 세션 ID로 사용자 데이터를 조회해야 했다.
    JWT는 사용자의 정보를 저장하고 있어 서버 입장에서 토큰 검증만 하면 되기에 확장성이 좋다고 한다.

토큰 인증 방식 단점

  • 서명된 JWT는 서버에서만 유효성을 검증할 수 있으나 그 안에 저장된 데이터는 아무나 접근이 가능하여, 민감한 정보는 주의가 필요하다. -> 사용자의 추가 정보는 서버에서 사용자 DB를 조회하는 것이 안전하다.

  • 서버가 인증 상태를 관리하지 않아도 되는 반면, 토큰이 탈취되면 서버에서 만료시킬 수도 없다.

  • Access Token의 유효기간이 짧으면 토큰 탈취에 대비하기 좋지만 사용자가 단기간에 재로그인 해야 하므로 사용자 경험을 저하시킨다. 반대로 길면 토큰 탈취의 경우 만료될 때까지 치명적일 수 있다.

  • 토큰에 여러 정보를 담을 수 있으나 데이터가 커질수록 암호화 과정이 길어지고, 토큰의 크기가 커져 네트워크 비용이 증가할 수 있다.

참고

profile
이로운 개발자

0개의 댓글