이번 강의에서는
JWT 토큰에 대해 이야기 하고자 합니다
이전에 말한 것과 같이
Spring Security에서 기본으로 생성되는 토큰인
JSESSIONID에서 마칠 수 없습니다
그에 대한 단점들 때문입니다
그래서 JWT 토큰과 같이 더욱 상급의 접근을 찾아봐야 합니다
JWT 토큰을 웹 애플리케이션 속으로
구현하기 위해서는
우선적으로 이해해야 합니다
그래서 JWT 토큰이 무엇입니까?
JWT는 JSON Web Token의 약자입니다
내부적으로 이 토큰들은
데이터를 JSON 형식으로 유지하기 때문입니다
그리고 이들은 웹 요청에 사용 되는데
특히 UI 클라이언트에서 백엔드 애플리케이션과
통신할 때 사용되며
REST 서비스의 도움으로 JSON 형식으로
통신하기 위해 설계되었습니다
JWT는 갖고 있는 특징들과 장점 덕분에
가장 많이 사용되고
가장 선호되는 토큰 종류입니다
더 나아가 JWT 토큰은 다른 토큰들과 같이
인증 및 인가 중
사용이 가능합니다
하지만 저에게 JWT 토큰의 특별한 점
또는 장점을 물으신다면
저의 대답은 이렇습니다 JWT 토큰은
토큰 자체의 내부에서 유저와 관련된 데이터를
저장 및 공유 할 수 있도록 도와 줍니다
이는 서버 쪽 세션 안에
유저에 대한 정보를 갖고 있어야 하는
번거로움을 줄여줍니다
그리고 이는
여러 서비스가 서로와 소통하려는
마이크로서비스 환경 속에서
엄청난 도움이 됩니다
무언가를 기억해야할 필요가 없고
완전히 무상태(Stateless)일 수가 있습니다
왜냐하면 JWT 토큰 자체에서
유저와 관련된 필요한 정보를 모두 갖고 있기 때문입니다
JWT 토큰이 유저의 정보를
저장 및 공유할 때 어떤 도움이 될 수 있을지
이해하기 위해서는
첫째로 JWT 토큰의 형식과
구조를 이해해야 합니다
JWT 토큰은 보통 세 부분으로 나눠지며
마침표 혹은 점으로 구분됩니다
해당 슬라이드를 보시면
이것은 JWT 토큰의 예시입니다
무작위로 작성된 텍스트가 있습니다
단순히 토큰을 보는 것 만으로는
안에 어떤 정보가 담겨 있는지 아무도 이해할 수 없습니다
하지만 토큰을 보시면
토큰 속 마침표가 두개 있습니다
노란색으로 표시된 부분을
우리는 JWT 토큰의
Header (헤더) 부분이라고 합니다
그리고 헤더와 마침표 사이에
초록색으로 표시된 부분은
토큰의 Payload (내용)
또는 바디라고 합니다
마지막으로 Signature (서명) 부분이 있습니다
이는 선택사항입니다
최종적으로 JWT 토큰 안에는
두 가지 필수 부분이 있습니다
JWT 토큰 속에는
첫째로 헤더 둘째로 내용이 있고
셋째로 서명이 있으며 서명은 선택 사항입니다
그리고 이런 부분들은 마침표로
구분됩니다
이제 헤더가 무엇인지 내용이 무엇인지
서명이 무엇인지 또 그 속에는 어떤 것들을 저장하는지
등의 질문이 많으실 것입니다
이제 그 내용을 빠르게 이해해 보도록 합시다
JWT 헤더 안에는
토큰에 대한 정보인 메타데이터가 저장되어 있습니다
이러한 헤더 속에는 주로
알고리즘이 무엇인지
토큰의 종류가 무엇인지
해당 JWT 토큰을 생성하며 사용된
토큰의 형식은 어떤 것인지 등의 정보를 담고 있습니다
따라서 헤더는 메타데이터 정보만을 포함하고 있습니다
그리고 화면의 좌측에 보시다시피
JWT 토큰 속 모든 정보는
평문 형식으로 보내지지 않습니다
헤더 속에 제가 저장하고자 하는 메타데이터는
알고리즘("alg")으로
이는 HS256이며 형태("typ")는 JWT 입니다
JWT 토큰 속 이러한 정보를 클라이언트에게
직접 전송하는 대신
JWT 토큰이 추천하는 바는
메타데이터의 값을 Base64로
인코딩하는 것입니다 이렇게하면 변환이 될 것이고
화면 속 우측 상자에서 확인할 수 있습니다
유사하게 JWT 토큰의
두번째 부분을 보면
이는 바디 혹은 내용(payload)라고 합니다
해당 부분 안에는
저장을 원하는 유저에 대한 모든 정보를 저장할 수 있습니다
예시로 그의 이름
이메일
역할
토큰이 발행될 때
만료 시간이 언제인지
토큰을 발행한 자가 누군지
토큰을 서명한 자는 누군지 등이 있습니다
따라서 JWT 토큰의 바디 혹은 내용
속에는 다양한 정보를 저장할 수 있습니다
여기서도 이러한 정보를
평문 형식 보다는
평문 형식을 Base64 Encoded 값으로
변환하여 전송합니다
로그인 과정이 성공적으로 진행되면
백엔드 애플리케이션에서 JWT 토큰을 생성하고
여기서 JWT 토큰은 헤더와 내용이
필수적으로 포함됩니다
그리고 클라이언트에서 게속해서 동일한 토큰을 예상하고
해당 토큰이 최초로
생성된 것과 동일한 토큰이라면
모든 후속 작업은 성공적으로 수행될 수 있습니다
하지만 최초로 생성된 것과
현재 수신하는 것 사이에
불일치되는 부분이 있다면
분명 백엔드 서버에서
에러가 나타날 것입니다
여기 JWT 토큰의 장점이 하나 더 있습니다
백엔드 서버의 가장 기본적인 접근은
해당 JWT 토큰을
처음 생성될 때마다
데이터베이스 혹은 캐시 속에 저장하는 것입니다
그리고 클라이언트에서 특정 JWT 토큰을 사용하는
모든 후속 요청에서는
해당 JWT 토큰이
이미 데이터베이스나 캐시에 저장된 토큰과
동일한지를 확인할 것입니다
따라서 이는 가장 기본적인 접근입니다
하지만 JWT 토큰의 서명 덕분에
어디에도 저장할 필요가 없습니다
백엔드 서버가 할 수 있는 것은
헤더와 바디 속 값이 있는
JWT 토큰을 생성할 때마다
토큰에 디지털 서명을 하여
나중에 누군가가 토큰을
조작하려고 하면 쉽게 감지할 수 있습니다
이제 JWT 토큰의 서명을 통해
어떻게 토큰을 저장소나 캐시에
저장하지 않고도
반복적으로 유효성을 검사할 수 있는지
살펴보겠습니다
해당 부분은 다음 강의에서
논의해 보겠습니다
다음 강의 이전에 반드시
JWT 토큰이 무엇인지
어떤 형식을 가지고 있는지
특히 header(헤더), payload(내용)와 signature(서명)에 대해 이해해 두시길 바라며
서명의 목적이 무엇인지는
다음 강의에서 살펴보도록 하겠습니다
그럼 다음 강의에서 뵙겠습니다
수고하셨습니다