JWT란?

Json Web Token의 약자로 모바일이나 웹의 사용자 인증을 위해 사용하며 인증에 필요한 정보들을 암호화시킨 토큰을 뜻한다!(토큰기반 인증방식)

 

 

https://jwt.io jwt사이트를 들어가 보게되면 암호화된 토큰을 볼 수 있는데 

 

토큰을 만들기 위해서는 크게 3가지, Header,Payload, Verify Signature가 필요하다!

 

Header : 위 3가지 정보를 암호화할 방식(alg 알고리즘 Verify Signature를 만드는 알고리즘이 들어감), 타입(jwt고정) 등이 들어감

Payload : 서버에서 보낼 데이터가 들어가며 일반적으로 유저의 고유 ID값, 유효기간이 들어간다

Verify Signature :  Base64 방식으로 인코딩한 Header,payload 그리고 SECRET KEY를 더한 후 서명된다.

 

최종적인 결과 : Encoded Header + "." + Encoded Payload + "." + Verify Signature

 

Header, Payload는 인코딩될 뿐(16진수로 변경), 따로 암호화 되지않는다. 따라서 누구나 디코딩하여 정보를 볼 수 있으며 Payload에 유저의 비밀번호같은 중요한 데이터가 들어 가면 매우 위험하다!

 

하지만 Verify Signature는 SECRET KEY를 알지 못하면 복호화할 수 없다!

예를 들어 사용자 A가 사용자 B의 정보를 훔쳐보고 싶어 Payload에 있던 A의 id대신 B의 id로 다시 인코딩한 후 받아온 토큰 값을 서버로 보냈다고 가정해보자.이때 서버에서는 Verify Signature 검사를 하게 되는데 Payload에 B의 id가 들어 있어도 A의 Payload로 기반으로 만들어진 Verify Signature때문에 유효하지 않은 토큰인 것 을 알 수 있다!결국 SECRET KEY를 알지 못하면 토큰을 조작 할수 없다는 것을 알 수 있다

 

 

 

JWT 인증방식

사용자가 로그인을 하면 서버에서는 DB에서 사용자가 맞는 지 확인 한 후 Access Token을 발급 하여 사용자에게 보내준다.

이렇게 로그인이 되고 사용자는 데이터를 요청하기위해 발급 받은 Access Token을 다시 서버로 보낸다. 그러면 서버는 Access Token값을 기준으로 판단하여 사용자가 맞는지 판다하고 요청하는 데이터를 응답해준다.

 

 

(장점)

 

1. 세션/쿠키는 별도의 저장소의 관리가 필요한것에 비해 JWT는 발급한 후 검증만 하면 되기 때문에 추가 저장소가 필요 없어 간편하다.

이는 Stateless 한 서버를 만드는 입장에서는 큰 강점이다!

Stateless : 어떠한 별도의 저장소도 사용하지 않는, 즉 상태를 저장하지 않는 것을 의미한다

 

2. 토큰 기반으로 하는 다른 인증 시스템에 접근이 가능하여 확장성이 뛰어남. (ex FaceBook,Google)

 

(단점)

 

1. 이미 발급된 JWT에 대해서는 돌이킬 수 없다. 세션/쿠키의 경우 만일 쿠키가 악의적으로 이용된다면, 해당하는 세션을 지워버리면 된다. 하지만 JWT는 한 번 발급되면 유효기간이 완료될 때 까지는 계속 사용이 가능하여 한번 털리면 유효기간 끝날때까지 방법이 없다.

-->  해결책 : 기존의 Access Token의 유효기간을 짧게 하고 Refresh Token이라는 새로운 토큰을 발급한다(다음 포스트 당첨)

 

2. Payload 정보가 제한적이다. 위에 말했던 이유인 Payload의 값은 누구나 디코딩이 가능하여 중요한 정보를 넣을 수 없다!

 

3. 세션/쿠키 방식에 비해 JWT의 길이는 길어 인증이 필요한 요청이 많아질 수록 서버의 자원낭비가 발생하게 된다!

 

 

참고 

https://tansfil.tistory.com/58?category=475681 

 

쉽게 알아보는 서버 인증 1편(세션/쿠키 , JWT)

앱 개발을 처음 배우게 됐을 때, 각종 화면을 디자인해보면서 프론트엔드 개발에 큰 흥미가 생겼습니다. 한때 프론트엔드 개발자를 꿈꾸기도 했었죠(현실은 ...) 그러나 서버와 통신을 처음 배

tansfil.tistory.com

 

'Web' 카테고리의 다른 글

Cookie/WebStorage (Local/Session Storage)차이  (0) 2021.08.03
Refresh/Access Token  (0) 2021.08.02
CSRF  (0) 2021.08.02
XSS  (0) 2021.07.30
세션/쿠키  (0) 2021.07.28

+ Recent posts