반응형
JWT를 활용하기 위한 기본 개념에 대해서 정리해보려고 합니다.
여러 포스트를 참고하여 작성했습니다. (참고 포스트 링크는 하단에 있습니다)
이 링크(https://jwt.io/)에서 JWT 데이터를 확인해볼 수 있습니다.
JWT(Json Web Tocken)
개념 : Stateless한 서버 운영을 가능하게 하는 토큰 기반 인증시스템 구현체
형태 : '.' 구분자로 나뉘는 3개의 문자열 (header.payload.signature)
header(헤더)
- 두가지 정보를 지닌다(typ, alg)
{ "typ":"JWT", // 토큰 타입 지정(JWT) "alg":"HS256" // 해싱 알고리즘 지정, 이 알고리즘은 토큰을 검증할 때 signature에서 사용된다 }
- 두가지 정보를 지닌다(typ, alg)
payload(내용)
토큰에 담을 정보. 정보의 한 조각을 claim이라고 부르며, 키값 쌍으로 구성. 한 토큰에 여러 개의 claim을 넣을 수 있다. claim은 세 종류로 나뉜다.
등록된(registerd) claim : 서비스에서 필요한 정보가 아닌, 토큰에 대한 정보를 담기 위해 이미 정해진 claim들. 선택적으로 사용함.
- iss : 토큰 발급자 (issuer)
- sub : 토큰 제목 (subject)
- aud : 토큰 대상자 (audience)
- exp : 토큰 만료 시간 (expiration). 시간은 NumericDate 형식이어야하며 현재시간 이후어야함.
- nbf : Not Before을 의미하며 토큰의 활성 날짜와 비슷한 개념. NumericDate형식이어야하며 이 날짜가지나기 전까지 토큰이 처리되지 않음.
- iat : 토큰이 발급된 시간(issued at). 이 값을 이용해 토큰의 age를 판단.
- jti : JWT 고유 식별자로서 중복처리 방지에 사용. 일회용 토큰 처리에 유용함.
공개(public) claim : 충돌이 방지된(collision-resistant) 이름을 가지고 있어야 함. 충돌 방지를 위해 URI 형식으로 지음.
{ "https://velopert.com/jwt_claims/is_admin":true }
비공개(private) claim : 서버와 클라이언트 협의 하에 사용되는 claim들. 등록된 claim과 중복될 수 있으니 주의.
{ "username" : "velopert" }
signature(서명)
- 헤더의 인코딩값과 정보의 인코딩값을 합친 후 비밀키로 해쉬하여 생성.
주의점
- claim Set은 암호화되지 않는다. 서명 없이 누구나 열어볼 수 있기 때문에 보안에 중요한 데이터는 넣으면 안 된다.
- 인코딩 특성상 claim Set이 길어지면 토큰 길이도 길어진다. 너무 많은 정보를 담으면 안 된다.
- 서버가 토큰을 가지고 있지 않아 강제로 만료시킬 방법이 없다. 토큰을 탈취 당하면 해당 토큰은 만료시까지 유효하게 된다.
참고 및 예제
https://velopert.com/2389
https://medium.com/@OutOfBedlam/jwt-%EC%9E%90%EB%B0%94-%EA%B0%80%EC%9D%B4%EB%93%9C-53ccd7b2ba10
JWT의 활용편으로 이어집니다.
반응형
'.etc' 카테고리의 다른 글
[생초보를 위한 엘라스틱서치 가이드] 엘라스틱 서치를 위한 키워드들 (0) | 2019.09.12 |
---|---|
[생초보를 위한 엘라스틱서치 가이드] Elasticstack으로 생초보도 할 수 있는 데이터 시각화 (0) | 2019.09.10 |
[생초보를 위한 엘라스틱서치 가이드] 한글 형태소 분석하기 기초 (0) | 2019.09.10 |
[생초보를 위한 엘라스틱서치 가이드] 검색엔진과 DB Like 검색의 결과가 다른 이유 (0) | 2019.09.09 |
CSRF란? (0) | 2019.07.04 |