두 개체의 Json 개체를 사용하여 가볍고 자기 수용적인 방식으로 안정적으로 정보를 전달하는 웹 표준(RFC 7519)입니다.
JWT 구성요소
3개의 현으로 구성되어 있습니다.
구분 기호로
aaaa.bbbbb.ccccc → 헤더, 내용, 서명으로 구성
- 헤더 헤더
- 헤더에는 두 가지 유형의 정보(typ 및 alg)가 포함됩니다.
- type은 토큰 유형 → JWT
- alg는 해시 알고리즘 지정 → HMAC, SHA256, RSA가 공통적으로 사용되며 토큰 검증 시 서명 부분에 사용됨.
- 전. { “유형”: “JWT”, “alg”: “HS256” }
- 헤더에는 두 가지 유형의 정보(typ 및 alg)가 포함됩니다.
- 유효 탑재량 세부 사항
- 토큰 보유에 대한 정보
- 정보 주장하다호출되어 이름-값 쌍으로 존재합니다.
- 토큰에는 여러 클레임이 포함될 수 있습니다.
- 청구 유형
- 등록된 청구
- 등록된 클레임은 서비스에 필요한 정보를 포함하도록 이름이 이미 설정된 클레임입니다.
- 등록된 클레임의 사용은 그 안에 포함된 클레임 이름과 마찬가지로 선택 사항입니다.
- iss : 토큰 발행자
- sub : 토큰 제목(제목)
- aud : 상징적 청중
- exp : 토큰 만료 시간(expiration)
- 시간은 NumericData 형식이어야 하며 항상 현재 시간에 따라 설정되어야 합니다.
- 시간은 NumericData 형식이어야 하며 항상 현재 시간에 따라 설정되어야 합니다.
- nbf: 토큰 활성화 날짜 이전이 아님
- NumericData 형식이며 토큰이 처리되지 않는 날짜를 지정합니다.
- NumericData 형식이며 토큰이 처리되지 않는 날짜를 지정합니다.
- iat: 토큰이 발행된(발행된) 시간, 토큰의 나이를 평가할 수 있습니다.
- jti: 이중 처리 방지를 위해 사용되는 JWT 고유 식별자 → 단방향 토큰에 유용
- 등록된 클레임은 서비스에 필요한 정보를 포함하도록 이름이 이미 설정된 클레임입니다.
- 공개 청구
- 충돌을 방지하는 이름이 있어야 합니다.
- 클레임 이름 충돌을 방지하기 위해 URI 형식빌드
- 전. “https:// … ” : 참
- 충돌을 방지하는 이름이 있어야 합니다.
- 사적 주장
- 등록된 주장도 공개된 주장도 아님
- 클라이언트-서버 양측 간의 합의에 의해 사용되는 클레임 이름입니다.
- 중복 이름 충돌이 발생할 수 있으므로 이름을 사용할 때 주의하십시오.
- 등록된 청구
- 서명 서명
- 헤더의 인코딩 값과 정보의 인코딩 값을 조합하여 주어진 비밀키로 해싱하여 생성합니다.
- 이렇게 생성된 해시는 base64 형식으로 표현됩니다.
- 헤더의 인코딩 값과 정보의 인코딩 값을 조합하여 주어진 비밀키로 해싱하여 생성합니다.
로그인 인증에 JWT 사용
수명이 짧은 토큰을 발행하면 사용자가 자주 로그인하는 것이 불편합니다.
수명이 긴 토큰을 발행할 때의 단점은 제3자에 의해 토큰이 도용될 경우 보안에 취약하다는 것입니다.
이를 보완하기 위해 Refresh Token을 사용하였고 Access Token과 동일한 JWT를 사용하였다.
액세스 토큰이 만료되면 새로 고침 토큰이 새로 발급된 키가 됩니다.
액세스 토큰 수명을 짧게, 갱신 토큰 수명을 길게 설정하고 액세스 토큰이 만료되면 갱신 토큰을 사용하여 새 토큰을 발행하십시오.
이 방법은 액세스 토큰을 도난당하더라도 정보 유출을 막을 수는 없지만 짧은 유효 기간으로 인해 도난 가능성을 줄이는 데 유용합니다.
또한 Refresh Token이 만료되면 사용자는 다시 로그인해야 하며 도난당할 가능성이 있으므로 그에 따른 유효기간 설정이 필요하다.