JWT에 대해서

구본식·2022년 8월 5일
4
post-thumbnail

1. JWT(Json Web Token)란?

  • jwt란 웹 문서의 표준으로서(RFC7519) 클라이언트와 서버간에 통신시 인증,권한을 위해 사용하는 토큰이다. 인증에 필요한 정보들을 암호화 시킨 JSON토큰을 의미한다. 그리고 JWT기반 인증은
    JWT 토큰(accessToken)을 HTTP Header에 실어서 서버로 전송하여 클라이언트를 식별하는 방식이다.

  • 디지털 서명방식을 사용한다. 서명 방식에는 HMAC, RSA 등이 있다.

    디지털 서명방식이란?
    : 비대칭 암호화 알고리즘으로 데이터를 암호화 시킬 키(개인키)와 복호화를 위한 키(공개키)가 다른 방식이다. 암호화 시킬 데이터를 마지막에 개인키로 잠궈보내주고 복호화하는 쪽에는 공개키로 오픈하여 오픈된다면 전송자가 전송한 데이터가 맞다는것을 판별하는 방식이다.

2. JWT 토큰을 사용하는 이유

  1. Session 방식은 서버내에 세션저장소를 사용하므로 클라이언트의 요청이 많아지면 그만큼 세션의 양도 많아져 서버 부하가 심해진다.

  2. 한 서버에서 처리할수 있는 클라이어트의 수가 정해져있다면 그보다 많은 요청을 처리하기 위해서 서버의 수를 늘리게 된다. 세션을 사용하게 되면 서버내에 세션 저장소를 사용하기 때문에 서버가 증가될시 사용자가 다시 로그인을 해야하는 상황들이 발생한다.(Stateful)
    하지만 JWT토큰은 세션저장소를 사용하지 않기 때문에 서버 확장성이 유연하다(Stateless)

❗단점
1. 쿠키/세션과 다르게 토큰 자체의 길이가 길어지기 때문에 인증 요청이 증가하면 네트워크 과부화가 생길수 있다.
2. Payload 자체는 암호화되지 않기 때문에 중요한 정보를 담으면 안된다.
3. 토큰을 탈취당하면 대처방법이 마땅하지 않다.
(access,refresh 토큰을 사용하여 access 토큰의 유효기간을 짧게 두고 refresh 토큰의 유효기간을 길게두어 문제를 극복하는 방식을 사용한다.)

3. JWT 구조

JWT는 .을 구분으로 세가지의 문자열 조합니다.
.을 기준으로 Header, PayLoad, signature를 의미한다.

  1. Header
    : signature를 암호화할 암고리즘에 대한 정보와 해당 토큰 타입정보가 있다. Header부분을 base64의 인코딩 방식으로 JWT의 Header부분을 만든다.

  2. PayLoad : 토큰에서 사용할 정보의 조각들인 Claim이 담겨져 있다.(실제 전송할 데이터를 JWT에 담는 부분) Claim에는 등록된 클레임, 개인 클레임으로 구분되어있다.

    💡참고
    Claim이란 key와 value형식으루어진 한 쌍의 정보를 의미

    • 등록된 클레임 : iss(발행자), exp(만료시간), iat(발행시간), sub(제목), aud(청중)등이 있으면 필수 요소는 아니다.
    • 개인 클레임: 실제 전송할 데이터를 담는 클레임이다. 담아 실을 데이터에 해당하는 id를 같이 넣어 보관한다.
  3. Signature: 앞서 Header, PayLoad를 각각 base64로 인코딩 한 값에 관리자만 하는 Secret Key를 더한후 Header에 정의한 알고리즘(HMAC or RSA)로 해싱하여 만든다(해싱한 값을 다시 base64로 인코딩 할수도 있음. 선택사항)

    💡참고
    Header, Payload는 단순이 base64로 인코딩 되었기 때문에 복호화가 누구나 할수 있지만 Signature는 서버측에서 관리하는 비밀키이기 때문에 누구나 복호화 불가능하다.
    따라서 JWT토큰을 복호화하기 위해서는 Signature부분을 복호화 하여야지 알수 있기 때문에 Signature는 토큰의 위변조 여부를 확인하기 위해서 사용한다.

profile
백엔드 개발자를 꿈꾸며 기록중💻

1개의 댓글

comment-user-thumbnail
2023년 1월 31일

항상 응원합니당

답글 달기