JWT(JSON Web Token)

김형준 Kim Hyeong Jun·2022년 10월 31일
0

내용 및 이미지 출처
[인증] 세션/쿠키 방식, JWT 방식
[인증] Access Token, Refresh Token
JWT의 개념의 개념부터 구현까지 알아보기
[WEB] 📚 JWTjson web token란 💯정리
[WEB] 📚 Access Token & Refresh Token 원리 (feat. JWT)

❓ Token 인증이란

토큰 기반 인증 시스템은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증이 되었다는 의미로 '토큰'을 부여한다.

  • 이 토큰은 유일하다.
  1. 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 심어 보낸다.
  2. 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과의 일치 여부를 체크하여 인증 과정을 처리하게 된다.

토큰은 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담을 덜 수 있다.

토큰 자체에 데이터가 들어있기 때문에 클라이언트에서 받아 위조되었는지 판별만 하면 된다.

  • Token 인증 방식

토큰에는 요청한 사람의 정보가 담겨있기에 서버는 DB를 조회하지 않고 누가 요청하는지 알 수 있다.

  • Token 방식의 단점
    1) 쿠키/세션 방식과는 다르게 토큰 자체의 데이터 길이가 길어, 인증 요청이 많아질수록 네트워크 부하가 심해질 수 있다.
    2) Payload 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다.
    3) 토큰을 탈취 당하면 대처하기 어렵다. -> 사용 기간 제한을 설정하는 식으로 극복한다.

JWT(JSON Web Token)

JWT란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
그리고 JWT 기반 인증은 JWT(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식이다.

JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화 한 것이다.

Base64 URL-safe Encode 는 일반적인 Base64 Encode 에서 URL 에서 오류없이 사용하도록 '+', '/' 를 각각 '-', '_' 로 표현한 것이다.

JWT 구조

각 구조에는

  1. 헤더(Header) : JWT에서 사용할 타입과 해시 알고리즘의 종류
  2. 내용(Payload) : 서버에서 첨부한 사용자 권한 정보와 데이터
  3. 서명(Signature) : 개인키(Private Key)로 서명한 전자서명

이 담겨있다.

Header와 Payload는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다.따라서 Signature는 토큰의 위변조 여부를 확인하는데 사용된다.

  • 암호화 <-> 복호화

JWT 인증 과정

  1. 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
  2. 서버에서 클라이언트로부터 인증 요청을 받으면, Header, PayLoad, Signature를 정의한다.Hedaer, PayLoad, Signature를 각각 Base64로 한 번 더 암호화하여 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.
  3. 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. (쿠키나 다른 곳에 저장할 수도 있음)API를 서버에 요청할때 Authorization header에 Access Token을 담아서 보낸다.
  4. 서버가 할 일은 클라이언트가 Header에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하여 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.인증이 통과되었으므로 페이로드에 들어있는 유저의 정보들을 select해서 클라이언트에 돌려준다.
  5. 클라이언트가 서버에 요청을 했는데, 만일 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 서버로부터 새로운 엑세스 토큰을 발급 받는다.

🎯 JWT는 서명(인증)이 목적이다.

토큰 안에 들어있는 정보가 무엇인지 아는게 중요한 것이 아니라 해당 토큰이 유효한 토큰인지 확인하는 것이 중요하다.

profile
I want be a developer🙂

0개의 댓글