https://www.youtube.com/watch?v=zC5dLbZMAW0

 

 

 


 

 

 

 

설명->

1) id,pw가 맞으면, 서버에서 응답을 해주는데, 이때,

token을 발급을 해줍니다.

 

2) 그러면 이제 클라이언트에서 다음 어떤 요청부터는 

token을 같이 넣어서, 요청을 해주면 됩니다.

 

3) 그러면 서버는

요청 받은 token을 확인하고 맞다면,

그의 맞는 

authorization(권한부여,허가)권한을 클라이언트에게 줍니다.

(session 기반에서는 Server에서 sessionID를 관리를 해주는데,

Token 기반에서는 Server에서는 관리를 해주지 않습니다.)

 

4) 왜냐하면, 여러가지 서비스를 제공해주기 위해서,

여러가지 서버를 만든다고 합니다.

그래서,

클라이언트는

어떤 서버에 접속을 할 때,

발급 받았던 token, 등등 보내주면,

 

5) 서버에서는

해당 token이 맞은지, 틀린지 확인만 해주고,

맞다며는 그 권한을 주는 것입니다.

 

6) (참고)

각각의 서버는 session 정보가 있는 것이 아니라,

사용자가 요청한 token만 보고, 권한을 주게 됩니다.

 

 

 


 

 

 

1. JWT(Json Web Token)란?

JWT는 개체와 개체 간에 정보 전달  권한 인가(Authorization)를 위해 사용되는 토큰입니다.
URL-safety하기 때문에 Header 또는 URL을 통해 전달합니다.


2. JWT 구조

JWT는 Header, Payload, Signature로 이루어져있습니다.
각 부분은 Json형태로 저장되어 있으며, 각각 Base64로 인코딩 되어 있고, "." 을 구분자로 각각 부분을 구분합니다.

Header : 토큰에 대한 기본정보
Payload : 전달할 정보
signature : 검증된 토큰 정보 

 

1) HEADER(헤더)

토큰에 대한 기본 정보가 저장됩니다.

alg : Signature를 어떤 알고리즘으로 암호화 했는지 명시한다. (ex : SHA256, RSA)
typ : 토큰의 타입을 지정한다. (ex : jwt)


2) PAYLOAD(페이로드)

전달하려고 하는 정보가 저장되어있습니다. PAYLOAD는 크게 3가지로 구분됩니다. 

등록된 클레임(Registered Claim)
이름이 이미 정해진 클레임입니다. 등록된 클레임은 모두 선택적으로 사용할 수 있습니다.

iss(issuer) : 토큰 발급자
sub(subject) : 토큰 제목
aud(audience) : 토큰 대상자
exp(expiration) : 토큰 만료 시간, NumericDate 형식으로 저장된다. (ex : 1480849147370)
nbf(not before) : 토큰 활성 날짜, 이 날이 지나기전에 토큰이 활성화되지 않는다.
iat(isuued at) : 토큰 발급 시간, 토큰 발급 이후의 경과시간을 알 수 있다.
jti : JWT의 고유 식별자, 중복적인 처리를 방지하기 위해서 사용한다. 

공개 클레임(Public Claim)
사용자 정의 클레임으로, 공개용 정보를 위해 사용됩니다.

비공개 클레임(Private Claim)
서버와 클라이언트 간 협의하에 사용되는 클레임입니다. 

3) Signature(서명)

토큰의 유효성을 검증할 때 사용하는 서명입니다. 서명은 헤더와 페이로드의 값을 각각 BASE64로 인코딩하고 "."를 구분자로 붙여줍니다. 그리고 비밀키를 이용해 헤더에서 정의한 알고리즘으로 암호화한 후, 다시 BASE64로 인코딩합니다.

//sha256으로 암호화 할 경우

header = base64_encode(header_json)
payload = base64_encode(payload_json);
signature = base64_encode(HMAC_SHA256(header + "." + payload, secret))
jwt = header + "." + payload + "." + signature


3. JWT의 용도 

회원 인증 
회원이 로그인을 하면 서버는 회원정보가 담긴 토큰을 발급해 줍니다. 그리고 회원이 서버에 데이터를 요청 할 때 마다 발급 받은 토큰 정보를 함께 전달하여, 인증받은 회원이라는 것을 증명합니다. 

정보 전달 
JWT는 Signature 정보를 이용해서 데이터 조작을 방지할 수 있으며, 안전하게 정보를 전달할 수 있습니다.


4. JWT의 장단점

장점

1) Stateless이며 확장성이 있다. 
서버와 클라이언트 간에 상태 정보를 저장하지 않으며 토큰을 가지고 있고 유효하다면 서버로 부터 데이터를 요청할 수 있습니다. 즉 개체간에 연결을 유지하지 않아도 됩니다.

서버를 여러대 사용하거나, 클라이언트 단말의 종류(PC, 모바일 등..)가 다양할 경우에도 토큰만 유효하다면 어떤 단말이든지간에 서버로 부터 데이터를 받을 수 있습니다. 
즉 JWT 인증 시스템을 만들어 두면 플랫폼에 상관없이 회원 인증 시스템 및 정보 전달이 가능합니다. 

2) 사용자 인증에 필요한 인증 저장소가 필요없다.
인증 정보가 토큰 자체에 포함되어있기 때문에 별도의 인증 저장소가 필요없습니다.

단점

1) 한번 발급된 토큰은 수정 및 삭제할 수 없다.
JWT는 stateless하기 때문에 토큰에 대한 정보를 관리하지 않습니다. 그래서 한번 만들어진 토큰은 삭제, 수정할 수 없습니다. 만약 토큰이 유출된다면 토큰이 만료될 때 까지 토큰을 가로챈 사용자가 서비스를 이용할 수 있습니다.

2) Payload 인코딩
Payload 값이 암호화된 값이 아닌 Base64로 인코딩 된 값이라 누구나 확인할 수 있습니다.
그래서 중요한 정보를 Payload에 저장해서는 안됩니다.

 

 

 


 

https://hijjang2.tistory.com/943

 

[Spring] jjwt library 사용방법 - JWT(Java Web Token)

1. jjwt란? jjwt는 JWT 토큰 생성 및 JWT 토큰 파싱, 검증을 해주는 라이브러리 입니다. 2. Maven dependency 추가 ... ... io.jsonwebtoken jjwt 0.9.1 ... ... 3. 예제 import io.jsonwebtoken.Claims; impor..

hijjang2.tistory.com