JWT, json web token
JWT 란 json 형식으로 사용자의 정보를 복호화가 가능한 암호로 암호화 하는 토큰이다. JWT는 토큰 자체를 정보로 사용하는 방식으로 안전하게 전달한다.
JWT가 동작하는 과정은 애플리케이션이 실행될 때 JWT를 static(정적) 변수와 로컬스토리지에 저장하게 된다. 정적 변수에 저장하는 이유는 매번 http 헤더에 담아 보내지 않고, 로컬스토리지에서 불러오게 된다면 오버헤드가 발생하기 때문이다.
클라이언트에서 JWT 를 포함해 요청을 보내면 서버는 허가된 JWT인지를 검사고, 로그아웃을 할 경우 로컬 스토리지에 저장된 JWT 를 제거한다.
JWT의 구조
JWT는 Header, Payload, Signature로 이루어져 있고, 각각의 구분자는 . 으로 구분한다.
Header
헤더에는 type 과 algorithm 정보로 구성되는데, alg는 헤더를 함호화하는 것이 아니라 Signature를 해싱하기 위한 알고리즘을 지정하는 것이다.
{
"type" : "JWT",
"algorithm" : "HS256"
}
Payload
페이로드에 토큰에 담을 정보가 들어있다. 담긴 정보의 한 조각을 claim 이라고 부르며, 이는 name, value 로 이루어져 있다.
클레임의 종류는 registered claim, public claim, private claim이 있다.
Registerd Claim(등록된 클레임) 은 토큰 정보를 표현하기 위한 정해진 종류의 데이터 틀이다.
{
"iss" : "토큰 발급자", // registerd claim
"sub" : "토큰 제목",
"aud" : "토큰 대상자",
"exp" : "토큰 만료 시간", // NumericDate 형식으로 되어 있어야 함 ex)1480849147370
"nbf" : "토큰 활성 날짜", // 이 날이 지나기 전까지 토큰은 활성화 되지 않음
"iat" : "토큰 발급 시간", // 토큰 발급 이후의 경과 시간을 알 수 있음
"jti" : "JWT 토큰 식별자", // 중복 방지를 위해 사용하며, 일회용 토큰(Access token) 등에 사용
}
Public Claim(공개 클레임) 은 사용자 정의 클레임으로 공개용 정보를 위해 사용된다. 충돌방지를 위해 URI 포맷을 사용한다.
{
"http://nacjji.tistory.com" : true
}
Private Claim(비공개 클레임) 은 사용자 정의 클레임으로 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다.
{
"token_type" : access
}
Signature(서명)
서명 토큰은 토큰을 인코딩하거나 유효성 검증을 할 때 사용되는 고유한 암호화 코드이다. 서명은 위에서 만든 헤더와 페이로드의 값을 각각 BASE64Url 로 인코딩하여 생성한다.
JWT 예시
JWT장점
- 편리한 인증 방식
JWT 단점
- 토큰 자체에 정보를 담고 있으므로 위험할 수 있다.
- 토큰에 3가지 종류의 클레임을 저장하기 때문에 정보가 많아질 수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
'JavaScript > node.js' 카테고리의 다른 글
Sequelize paranoid(삭제-복구) (0) | 2022.12.24 |
---|---|
컨트롤러(Controller) (0) | 2022.12.10 |
아키텍쳐 패턴(Architecture Pattern) (0) | 2022.12.10 |
Node.js, 파일 시스템 기능 (1) | 2022.11.24 |
Node.js, node.j란? (0) | 2022.11.24 |