-
[Web] JWT (Json Web Token) 기본 개념과 회고기타/WEB 2022. 6. 29. 15:00
Json Web Token 이란?
선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준(RFC7519 표준)으로,
페이로드는 몇몇 클레임(claim) 표명(assert)을 처리하는 Json을 보관하고 있다.
토큰은 비공개 시크릿 키 또는 공개/비공개 키를 사용하여 서명된다.
JWT는 헤더, 페이로드, 서명의 구조로 되어있으며,
각 부분은 Base64url으로 인코딩되어 '.' 기호를 사용하여 하나의 토큰으로 연결된다.
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
구조의 각 부분 설명
https://ko.wikipedia.org/wiki/JSON_%EC%9B%B9_%ED%86%A0%ED%81%B0 클라이언트에서 사용자가 로그인을 하면 서버는 아래와 같은 access_token을 생성하고, 클라이언트에 이를 전달해주게 된다
{ "access_token": "eyJhb...", "token_type": "Bearer", "expires_in": 3600 }
클라이언트는 받은 token을 저장해두었다가
서버에 필요한 정보를 요청할 때에는 Bearer 스키마를 사용하여 Authorization 헤더 안에 JWT를 보내어 요청한다
Authorization: Bearer eyJhbGci...<snip>...yu5CSpyHI
이는 무상태 인증 매커니즘으로서, 사용자의 상태는 서버 메모리에 전혀 저장되지 않는다
서버의 보호된 루트는 Authorization 헤더 내의 유효한 JWT를 검사하며, 유효한 경우에만 보호된 자원으로의 접근이 허가된다
JWT가 자가 수용적(self-contained)이므로 필요한 모든 정보는 JWT에 있으며 데이터베이스를 여러 번 조회할 필요를 줄여준다
기본적인 개념은 위와 같다.
출처 : https://ko.wikipedia.org/wiki/JSON_%EC%9B%B9_%ED%86%A0%ED%81%B0
이해 참고글: http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
---
내가 사용했던 방법과 회고
첫번째 프로젝트에서 JWT 토큰을 사용할 때는 위와 같은 방법으로 발급했다.
클라이언트에서 JWT 토큰을 저장하도록 한 것. refresh_token과 access_token을 발급해서 사용하도록 했다.
이 때는 선임개발자분이 이렇게 만들어두어 따라 했었다.
그때는 refresh token과 access token의 흐름을 이해하는 것만으로도 어려웠던 기억이 난다.
두번째 프로젝트에서는 내가 사용자 인증을 처리해야했다.
나는 이 프로젝트에서 최종적으로 JWT토큰을 발급하여 세션에 넣어 사용하는 방식을 택했다.
왜냐하면 클라이언트에서 JWT토큰을 저장하고 있는 것이 안전한가?에 대한 의문이 들었고, 해커가 JWT토큰을 탈취하여 header(Authorization)에 담아 서버로 보내면 서버는 정상 요청으로 판단할 것이라는 생각이 들었다.
(... 이걸 하면서 해킹공부도 해야하는걸까.라는 생각을 잠깐했었다. 위 내용도 결국 어떤 정보를 탈취할 수 있는지 모르면서 뇌피셜로 풀어나갔기 때문에..ㅠ..)
그래서 맨처음에는 쿠키(httpOnly: true, secure: true, signed: true 설정한)에 JWT 토큰을 담아서 사용자 정보를 사용했다.
그러다가 쿠키만으로는 사용자 관리가 어려워 결국 JWT를 세션에 넣어 사용하게 되었다.
이미 발급된 JWT토큰이 있으면 정보에 접근이 가능하기 때문에, 중간에 정지된 회원을 관리할 수가 없었기 때문이다.
하지만 이번에 JWT 개념을 다시 찾아보고 이해하면서
두번째 프로젝트에서 한 방법에서는 굳이 JWT를 사용해야했나? 라는 생각이 들었다.
JWT는 클라에 저장해서 서버 트래픽을 줄이는 이점이 있어 사용하는 것이라고 하는데,
JWT를 세션에 담아서 사용하면 무슨 소용이지?라는 생각....
어떻게 해야 JWT토큰을 제대로. 유용하게 사용할 수 있을까?
보안에 대해서 제대로 알지를 못하니 대답할 수 없는 질문만 늘어간다.
웹 보안에 대해서도 꼭 한번 공부하고 풀어가봐야겠다.