알고 넘어가자 : jwt
* Json Web Token(JWT)란?
토큰 기반의 인증 시스템이다.
json객체를 사용하며, 자가수용적인(self-contained) 방식으로 정보를 안정성 있게 전달해준다.
jwt는 웹 표준이며, 수 많은 프로그래밍 언어에서 지원된다.
주로 회원인증 및 권환 등에서 사용한다.
# self-contained 방식 : 독립적인, 자기 완결적 방식.
# jwt 구조 :
Header.Payload.Signautre 의 형태로 구성(.포함)되어 있다.
Header(헤더) : alg는 Signautre를 해싱하기 위한 알고리즘 지정하는 곳이다.
{
'typ' : JWT, // 토근의 타입
'alg' : 'HS256' // HMAC SHA256 or RSA 사용
}
# Payload(정보) : 토큰에서 사용 할 클레임(Claim)이 담겨있다.
registered(등록), public(공개), private(비공개) 클레임 조각으로 구성되어 있다.
## registered claim options :
- iss(Issuer) : 발행자
- sub(Subject) : 제목
- aud(Audience) : 대상자
- exp(Expiration Time) : 만료 시간
- nbf(Not Before) : 토큰 활성 유효 날짜
- iat(Issued At) : 토큰 발급 시간
- jti(JWT ID) : 토큰 식별자(중복방지, 일회용 토큰 사용시)
## public claim : 충돌이 방지된 이름을 사용해야하며, 이를 위해 URI를 이용한다.
## private claim : 서버와 클라이언트 사이의 임의로 지정한 사용자 정의 클레임이다. 정의된 이름이 중복 될 수 있으므로, 주의한다.
# Signautre(서명) : 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다. 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 주어진 비밀 키로 해싱하여 코드를 생성한다.
# JWT 주의사항
- 정보 자체는 암호화 된 것이 아니라 BASE64로 인코딩 된 것이다. 중간에 정보를 탈취하여 디코딩하면 데이터를 볼 수 있으므로, JWE로 암호화 하거나 Payload에 중요 데이터를 넣지 않아야 한다.
- 토큰은 한번 만들어지면 삭제하는 것이 불가능하므로, 토큰의 만료 시간을 꼭 넣어주어야 한다.