티스토리 뷰
JWT(Json Web Token)란?
• 두 당사자 간의 청구를 JSON개체로 안전하게 전송하기 위한
간결하고 독립적인 방법을 정의하는 개방형 업계 표준 RFC7519방법입니다.
• 이 정보는 디지털 서명이 되어 있으므로 확인하고 신뢰할 수 있는 정보입니다.
• JWT는 공개 / 개인 키 쌍을 사용하여 서명할 수 있습니다.
• 서명된 토큰은 그 안에 포함된 청구의 무결성을 확인할 수 있는 반면,
암호화된 토큰은 이러한 청구를 다른 당사자로부터 숨깁니다 .
• 공개/개인 키 쌍을 사용하여 토큰에 서명하는 경우,
서명은 개인 키를 보유하고 있는 당사자만이 서명한 사람임을 인증 할 수 있습니다.
JWT (Json Web Token)는 언제 사용 하는가?
● 승인
• JWT를 사용하는 가장 일반적인 경우입니다.
• 사용자가 로그인하면 각 후속 요청에 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로,
서비스 및 리소스에 액세스 할 수 있습니다.
• Single Sign On 기능은 오버해드가 적고 다양한 도메인에서 쉽게 사용할 수 있다는 점 때문에 JWT를 많이 사용합니다.
● 정보교환
• JSON 웹 토큰은 당사자 간에 정보를 안전하게 전송하는 좋은 방법입니다.
• 공개/개인 키 쌍을 사용하여 JWT에 서명할 수 있으므로 보낸 사람이 누구인지 확인할 수 있습니다.
• 헤더와 페이로드를 사용해 서명을 계산하므로 콘텐츠가 변조되지 않았는지 확인할 수도 있습니다.
JWT 구조
HEADER (헤더) . PAYLOAD(내용) . VERIFY SIGNATURE(서명) 이 .(DOT) 형식으로 구분하여 JWT 토큰 1개를 이룹니다.
HEADER - 헤더
{
"alg": "HS256",
"typ": "JWT"
}
해시 알고리즘과 토큰ㅇ의 타입을 정의 할 수 있습니다.
HS256은 HMAC SHA 256, 해시 알고리즘 중 한가지를 의미하고
JWT는 이 토큰을 JWT로 지정하겠다는 의미입니다.
PAYLOAD - 내용
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
전달하는 데이터를 포함할 수 있습니다. 대표적으로 개발자가 원하는 데이터를 저장합니다.
PAYLOAD는 서명된 파트가 아니고 단순 Base64인코딩된 파트이므로 누구나 디코딩(복호)하여 열람이 가능합니다.
때문에 password같은 결정적인 요소들은 PAYLOAD에 포함해서는 안됩니다.
VERIFY SIGNATURE - 서명
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
secret = 유저가 지정하는 비밀 코드
서명 파트는 Base64인코딩된 HEADER "." PAYLOAD, SECREAT이 필요합니다.
이렇게 해싱을 하게되면 서명이 완성됩니다.
json 데이터 암호화
const token = jwt.sign({ myPayloadData: 1234 }, "mysecretkey");
console.log(token);
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE3MDYyNDYzMjl9.Td3-XRPvIdtO5uVbaT8foA8-ROFQM5DxpjSixWwCow0
위처럼 출력해 보면 . 을 기준으로 HEADER . PAYLOAD . VERIFY SIGNATURE 로 인코딩되어 나오는걸 확인 할 수 있습니다.
코드로 복호화
const decodedValue = jwt.decode(token);
console.log(decodedValue);
// { myPayloadData: 1234, iat: 1706246329 }
보면 객체 형태로 내용이 나오는걸 확인 할 수 있는데 'mysecretkey'라고 적힌게 사라지고 iat : 1706246329 이 출력되는걸
확인 할 수 있습니다.
이걸로 확인 할수 있는것이 비밀키를 몰라도 누구나 복호화를 할수 있다는 것입니다.
그리고 뒤에 나오는 iat는 라이브러리에 의해 자동으로 추가되며 토큰이 발급된 타임스탬프를 나타냅니다.
변조되지 않은 데이터인지 검증
const decodedValuebyVerify = jwt.verify(token, "mysecretkey");
// 잘못된 비밀키를 입력한다면 검증에 실패하여 에러 발생!
// const decodedValuebyVerify = jwt.verify(token, "secretkey");
console.log(decodedValuebyVerify);
// 검증 성공시
// { myPayloadData: 1234, iat: 1706246329 }
// 검증 실패시
// JsonWebTokenError: invalid signature
jwt의 verify메서드를 사용하여 올바른 비밀키로 서명되었는지 확인하고 올바른키인것으로 확인이 된다면
데이터가 잘 나오지만
만약 실패한다면
에러가 뜨게 됩니다.
'프로그래밍 기초 > CS' 카테고리의 다른 글
동시성문제와 격리수준에 대해서 (0) | 2024.02.20 |
---|---|
Access Token 과 Refresh Token (0) | 2024.02.16 |
쿠키(Cookie)와 세션(Session) (0) | 2024.02.13 |
JWT 사용자 인증 미들웨어 (0) | 2024.01.27 |
REST API란? (0) | 2024.01.23 |