JWT( Json Web token)
json 데이터 구조로 표현한 토큰으로
json으로 전자 서명을 하여, URL-safe 문자열로 표현한 것이다
서버와 클라이언트 간 정보를 주고 받을 때, Http 리퀘스트 헤더에 json 토큰을 넣은 후,
서버는 별도의 인증 과정 없이 헤더에 포함되어 있는 JWT 정보를 통해 인증한다.
JWT는 세 파트로 나누어지며, 각 파트는 점로 구분하여 xxxxx.yyyyy.zzzzz 이런식으로 표현됩니다
해더는 알고리즘을 Signature를 해싱하기 위한 알고리즘을 지정하는 것이다.
페이로드는 토큰에 담을 클레임 정보를 포함하고 있다.
시그네쳐는 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 시크릿 키를 포함하여 암호화되어 있다.
JWT 장점
JWT 의 주요한 이점은 사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요없다는 것입니다.
분산 마이크로 서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 인가 방법을 제공합니다.
개별 마이크로 서비스에는 토큰 검증과 검증에 필요한 비밀 키를 처리하기위한 미들웨어가 필요합니다. 검증은 서명 및 클레임과 같은 몇 가지 매개 변수를 검사하는 것과 토큰이 만료되는 경우로 구성됩니다.
토큰이 올바르게 서명되었는지 확인하는 것은 CPU 사이클을 필요로하며 IO 또는 네트워크 액세스가 필요하지 않으며 최신 웹 서버 하드웨어에서 확장하기가 쉽습니다.
JWT 단점
- 토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없습니다.
- 더 많은 필드가 추가되면 토큰이 커질 수 있습니다.
- 비상태 애플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있습니다.
토큰 예시
- 회원 인증: JWT 를 사용하는 가장 흔한 시나리오 입니다. 사용자가 로그인을 하면, 서버는 사용자의 정보를 기반으로한 토큰을 발급합니다.
그 후, 사용자가 서버에 요청을 할 때 마다 JWT를 포함하여 전달합니다. 서버는 클라이언트에서 요청을 받을때 마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 사용자가 요청한 작업에 권한이 있는지 확인하여 작업을 처리합니다.
서버에서는 사용자에 대한 세션을 유지 할 필요가 없습니다. 즉 사용자가 로그인되어있는지 안되어있는지 신경 쓸 필요가 없고, 사용자가 요청을 했을때 토큰만 확인하면 되므로 세션 관리가 필요 없어서 서버 자원과 비용을 절감할 수 있습니다. - 정보 교류: JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법입니다. 그 이유는, 정보가 서명이 되어있기 때문에 정보를 보낸이가 바뀌진 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있습니다.
Access token & Refresh token
액세스토큰은 수명이 있다. ex) 60일 90일
토큰 수명이 끝나면 에이피아이가 정보를 주지 않는다.
리프레쉬 토큰이 액세스 토큰의 수명을 다시 준다.
RFC( 인터넷과 관련된 여러 기술 표준)
엑세스 토큰 처음 발급할때, 엑세스토큰과 리프레쉬 토큰을 동시에 받는다.( 아닌 경우도 있다.)
엑세스토큰으로 리소스를 받는다.
' invalid token error ' 가 뜨면, 리프레쉬 토큰의 수명이 다했다는 것이다.
이때 리프레쉬 토큰을 보내서 액세스 토큰을 다시 받는다.
이때, 액세스 토큰만 발급 받거나, 액세스 토큰과 리프레쉬 토큰을 다시 받는 경우도 있다.
token 로그인 인증
문제
유효기간 짧으면 사용자 불편
유효기간 늘리면 보안 취약
-> 유효기간 짧게 하면서 보안 문제 해결방법 -> Refresh Token
과정
내용 참고:
'Web > 웹운영' 카테고리의 다른 글
ngrok) 쉽게 로컬호스트 공유하기 (0) | 2022.03.11 |
---|---|
Search) 검색에서 특수문자 query 문제와 base64 (0) | 2022.02.03 |
JWT 설계 (0) | 2021.12.15 |
OAuth (0) | 2021.11.14 |