ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT(Json Web Token) - 비대칭키 기반 토큰 인증 방식
    Web 2021. 11. 4. 21:21

    JSON Web Token은 비대칭 암호화 알고리즘을 사용하는 토큰형 인증 방식의 하나로, Claim 기반의 토큰이다. 토큰 자체를 정보로 사용하는 Self-Contained 방식을 이용해서 정보를 안전하게 전달할 수 있다.

    서명된 토큰은 해당 토큰에 포함된 클레임의 무결성을 확인할 수 있고, 암호화된 토큰은 다른 당사자의 클레임을 숨긴다. 공개키/개인키 쌍을 사용해서 토큰에 서명하면 개인 키를 보유한 사람만 토큰에 서명했음을 인증한다.

     

    JWT는 언제 사용할까 ❓

    인증/인가

    JWT를 사용하는 가장 보편적인 방법이다. 사용자가 로그인하면 이후 모든 요청에 JWT 토큰을 헤더에 담아 인증할 수 있다. JWT를 이용하면 해당 토큰으로 허용되는 경로, 서비스, 리소스에 접근할 수 있다. 오버헤드가 적고 여러 도메인에서 쉽게 사용할 수 있어 가장 많이 사용하는 기능이다.

    정보 교환

    당사자 간 정보를 안전하게 전송하는 방법일 수 있다. 공개/개인 키 쌍을 이용해서 JWT에 서명할 수 있기 때문에 발신자를 파악할 수 있다. 헤더와 페이로드를 사용해서 시그니처를 계산하기 때문에 콘텐츠의 변조 여부도 확인할 수 있다.

     

    JWT의 구조 🤔

    JWT는 Header, Payload, Signature의 세 부분으로 이루어지고, '.'을 사용해서 구분된다.

    Header는 JWT라는 타입, 암호화 할 알고리즘 종류를 담고 있다.

    Payload는 사용자, 추가 데이터에 대한 정보를 포함한 클레임을 표현한다. 클레임에는 registered/public/private의 세 종류가 있다. 각각은 다음과 같은 정보를 담고 있다.

    • Registered Claim: iss(issuer), exp(expiration time), sub(subject), aud(audience)와 같은 정보
    • Public Claim: 공개용 정보를 위한 사용자 정의 클레임
    • Private Claim: 서버/클라이언트 간 정보 공유를 위한 맞춤형 클레임

    Signature를 만들기 위해서는 인코딩된 헤더와 페이로드, 헤더의 알고리즘이 필요하다. 이는 메시지의 변경 여부를 확인할 수 있고, 개인 키로 서명된 토큰의 경우 발신인도 구분할 수 있다.

    헤더와 페이로드의 값을 Base64로 인코딩한다.

    인코딩한 값을 비밀키를 이용해서 헤더에서 정의한 알고리즘으로 다시 암호화하고 이 값을 다시 Base64로 인코딩해서 생성한다.

     

    JWT의 실제 사용

    인증을 구현할 때 사용자가 로그인을 하면 Access Token을 반환한다. 일반적으로 토큰의 만료 시간은 짧게 잡는 것이 좋고, 민감한 데이터를 브라우저에 저장하면 안 된다.

    생성된 토큰은 헤더에 포함되어 Authorization의 value로 사용되고, 앞에는 주로 Bearer가 붙는다.

    Authorization: Bearer {생성된 토큰 값}

    서버는 Authorization 헤더에 유효한 JWT가 있는지 확인하고 JWT가 있는 경우 토큰을 검증해서 보호된 리소스에 액세스할 수 있는 권한을 부여한다. 또한 이 헤더로 전송된 토큰은 쿠키를 사용하지 않아 CORS로부터 안전하다.

     

    JWT의 단점

    Self-Contained

    토큰 자체가 정보를 담고 있으므로 탈취당했을 때 위험하다.

    토큰 길이

    토큰의 페이로드에 3종류의 클레임을 저장하기 때문에, 정보가 많아질수록 토큰의 길이가 늘어나 네트워크 부하를 줄 수 있다.

    Payload 인코딩

    페이로드 자체는 암호화된 것이 아니라, Base64로 인코딩된 것이다. 중간에 페이로드를 탈취해서 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화하거나 Payload에 중요 데이터를 넣지 말아야 한다.

    Stateless

    JWT는 상태를 저장하지 않기 때문에 한번 만들어지면 제어가 불가능하다. 즉, 토큰을 임의로 삭제하는 것이 불가능하므로 토큰 만료 시간을 꼭 넣어줘야 한다.

    Tore Token

    토큰은 클라이언트 측에서 관리해야 하기 때문에 토큰을 저장해야 한다.

Designed by Tistory.