JWT란 무엇이고 어떻게 써야 되는가? (쿠키, 세션 또는 기타 저장방식 이용)

유수민·2022년 7월 10일
1

지식창고

목록 보기
14/64

JWT란 Json Web Token의 약자입니다.

어려운 말로 정리하자면, 전자 서명된 URL-safe (URL로 이용할 수있는 문자 만 구성된)의 JSON 형식으로 인증에 필요한 정보들을 암호화시킨 토큰을 의미합니다. 무슨 말일까요?

우선 왜 JWT가 사용되는지 등장배경부터 알아보도록 하겠습니다.

📌등장배경

JWT는 세션인증의 단점을 보완하고자 등장하게 되었습니다.
기존의 인증 시스템에서는 서버에서 유저들의 정보를 기억하고 있어야 했습니다. 하지만 이 방법은 웹과 모바일의 사용자가 늘어날수록 서버에 저장하는 데이터 양이 많아지고, 인터넷 통신 속도가 빨라지면서 서버 과부화와 성능저하를 야기했습니다. 이를 위해 , Scale out을 했지만 세션불일치 이슈와 같은 또다른 문제점들이 발생했습니다.또한 모든 데이터를 매번 서버에서 받아오는 것이 속도적으로 느리다는 문제들도 발생했습니다.
그래서 ‘서버에서 유저들의 정보를 관리해서 발생하는 문제들이니까 서버에서 관리하지 않게 하는 방법이 없을까?’ 해서 JWT가 등장하게 된것입니다. 즉, Token 기반 인증 방식의 JWT는 유저들의 관리를 서버에서 직접 관리하지 않고 클라이언트에서 유저들의 정보를 관리하도록 한 것입니다.

하지만 클라이언트에서 유저들의 정보를 저장하게 된다면, 클라이언트 마음대로 정보가 수정되거나 삭제되는 일도 발생하게 됩니다. JWT는 이를 유저가 자신의 데이터를 볼 수 있지만 수정은 하지 못하는(read-Only) 방법으로 해결했습니다. 그리고 데이터를 수정하려고 한다면 무조건 서버
를 통해서만 가능하도록 하였습니다. 즉, 클라이언트의 정보는 클라이언트가 가지고 있되 맘대로 조작할 수 없고, 서버에서는 토큰 유효 확인하여 토큰이 유효할 때만 조작할 수 있게 하는 것입니다.

💡 정리

  • 세션에서는 세션 ID만 서버에 전달하면 된다. 세션에 대한 모든 정보와 유저의 정보가 세션 DB에 저장되어 있다.
    → 인증을 위해 세션의 DB 필요
  • JWT는 유저를 인증하는데 필요한 정보(유저정보)를 토큰에 저장하여 사용자에게 전달하고 서버에서는 해당 토큰이 유효한지 검사한다.
    → 인증을 위해 암호화

📌JWT 구조

JWT의 구조는 (Header).(Payload).(Signature)로 구성되어 있습니다.

  • Header : 토큰의 종류와 Signature 생성을 위해서 어떤 알고리즘을 사용했는지가 명시되어 있습니다.
  • Payload : 토큰에 담아서 우리가 서버 보내고자 하는 데이터. 유저의 고유 ID값, 유효기간이 담겨져있습니다.
  • Signature : Base64 방식으로 인코딩한 Header,payload 그리고 Secret Key를 더한 것. 데이터가 조작되었는지 토큰이 유효한 것인지 검증해줍니다.

📌JWT를 통한 인증 방식 과정(사용법)

  1. JWT는 유저가 로그인하고 유저명과 비밀번호가 맞다면 서버는 DB에 세션 DB를 생성하지 않고, 유저의 ID를 가져다가 사인 알고리즘을 이용해 '사인'을 한다.
  2. 그리고 해당 '사인된 정보'를 string 형태로 토큰에 담아 전송한다.
    → JWT를 이용하면 HTML5 로컬 스토리지와 쿠키도 이용가능!
  3. 서버에 요청을 보내려면 세션 ID와 비슷하게 사인된 정보나 토큰을 보내주어야 한다.
  4. 서버는 토큰을 받으면 해당 사인이 유효한지 체크하고 토큰이 유효하다면 서버는 우리를 유저로 인증한다.

📌JWT의 한계

  1. 서버를 대신해서 클라이언트가 로그인한 사용자의 상태 정보를 기억하는 것이기 때문에, 토큰 자체에 로그인한 사용자의 상태 정보가 담겨 있습니다. 따라서 상대적으로 서버보다 보안이 튼튼하지 못한 클라이언트에서 토큰이 탈취당하면 몇몇 개인정보까지 탈취당할 위험이 있습니다.

    • 사용자의 상태 정보 중 공개 가능한 정보만 담아야 합니다.
    • 담지 말아야 될 정보
      • 패스워드
      • 개인 정보
    • 토큰에 있는 값을 Frontend가 풀 수 없게끔 구성해야 합니다.
      • JWT를 생성하는 secret 키 값은 반드시 감춰야 함
  2. 더군다나, 세션 기반 인증과 달리 서버는 이미 한 번 발급한 토큰을 무효화시킬 방법이 없기 때문에 탈취된 토큰은 그 유효 기한이 지나기 전까지 마음껏 사용할 수 있다는 단점을 가졌습니다.

    • 그래서 온전히 JWT만으로 모든 인증을 처리하게 할 수 없습니다.
      • Redis, MongoDB등에 추가적으로 저장해두고, 유효한 JWT 토큰을 다시 검사해야 합니다.
profile
배우는 것이 즐겁다!

0개의 댓글