-
JWT(Jason Web Token)express 2022. 1. 20. 00:00
JWT
Authentication 인증 로그인/ 일정 권한이 주어진 사용자임을 id pw등을 통해
인증받는것
Authorization 로그인이 유지되는 상태에서 일어나는 일
한번 인증을 받은 사용자가 이후 서비스의 여러 기능들을 사용할 때
로그인후 친구의 목록을 보거나, 내 담벼락에 글을 작성하거나,
친구게시물에 내아이디로 좋아요나 댓글달기와 같이 내 계정으로만 할 수 있는 활동을 시도할 때
페북이 내가 로그인 되어있음을 알아보고 허가를 해주는것
로그인이 생각보다 무거운 작업
이를 반복하지 않기 위해서 session이란게 나왔다.
쿠키(브라우저에 저장되는 정보)
세션: 어떤 사용자가 서버에 로그인이 지속적으로 되어있는 상태를 session이라고 함
사용자가 로그인에 성공하면 서버는 '세션표딱지'를 출력
절반은 서버(메모리, 서버, DB등 설정하기 나름), 절반은 사용자 브라우저로 보냄
표반쪽을 가진 브라우저(크롬)가 이 표를session ID란 이름의 쿠키로 저장
이 브라우저는 앞으로 로그인된 사이트에 요청을 보낼 때 마다 이 표딱지를 실어보냄
서버는 이 표딱지 반쪽와 맞는 짝이 있는지 확인해서 있으면 authorization을해줌.
JWT를 사용하는 서비스에서는 사용자가 로그인을 하면 토큰이라는 표를 출력해서 건네줌.
이번에는 찍어서 주지 않고 그냥줌. 즉 서버가 뭔가를 기억하고 있지 않음.
토큰: 인코딩 또는 암호화된 3가지 데이터를 이어 붙인것
1번 헤더, 2번 페이로드, 3번 서명
페이로드: base64로 디코딩해보면,
토큰발급처,
토큰유효기간,
서비스가 제공하길원하는정보: 사용자의 닉네임, 서비스레벨, 관리자레벨등등
이런것들을 클레임Claim이라고함
사용자가 로그인을 하고나서 받는 토큰에 이 정보들이 클레임이라는 걸로다가 실려옴.
이를 위조하는게 가능하지 않냐? 그걸막기위해 1번 3번이 있음
1번 헤더의 구성:
type:JWT와
alg(알고리즘): 3번 서명값을 만드는데 사용될 알고리즘1번헤더와 2번 페이로드, 서버에 감춰놓을 비밀값 이 셋을 암호화 알고리즘에 넣고 돌리면 3번값이 나옴
이처럼 시간에 따라 바뀌는 어떤 상태값을 안 갖는걸 stateless하다고함
세션은 stateful
여기에도 단점이 있다.
1. 세션은 stateful해서 모든 사용자들의 상태를 기억하고 있음. 즉 기억하는 대상의 상태들을 언제든
제어할 수 있다.
-ex>한 기기에서만 로그인 가능
PC에서 로그인한 상태의 어떤 사용자가 핸드폰에서 또 로그인하면 PC에서 로그아웃하도록 책상의 표딱찌를
버리면 세션을 종료시킬 수 있음.
JWT는 서버가 발급 내역이나 정보를 쥐고있지 않아도 되서 편한데, 쥐고있지 않으니 통제는 못한다.
최악의 경우 토큰을 탈취당하더라도 이 악당이 가져가버린 토큰을 무효화할 방법도 없는거임
그래서 많이 쓰는방법:
토큰을 두개 발급해서 사용자에게 줌
1. aceess토큰 유효기간 몇분 or 몇시간
2. refresh토큰 유효기간 보통 2주
refresh토큰은, 상응값을 데이터베이스에도 저장
유저는 access토큰의 수명이 다하면 refresh토큰을 보냄
서버는 그걸 데이터베이스에 저장된 값과 대조해보고 맞다면 새 access토큰을 발급해줌
즉 refresh토큰만 안전하게 관리된다면 access토큰이 만료 될 때 마다 다시 로그인을 할 필요 없이
새로 발급을 받을 수 있음.
중간에 엑세스 토큰을 탈취당하더라고 오래 사용못함
리프레시토큰을 디비에서 지워버리면 토큰갱신이 안되서 강제로그아웃도 가능출처:
https://www.youtube.com/watch?v=1QiOXWEbqYQ&list=PLpO7kx5DnyIEXyPYwOk4YFFmtz5yz1v36&index=5
'express' 카테고리의 다른 글
req.cookies와 req.header.cookie 의 차이점 (0) 2022.03.21 미들웨어 간단정리 (0) 2022.02.06 Cors(Cross Origin Resource Sharing) (0) 2022.01.19 HTTP Cookies and Session (0) 2022.01.17 로그인 암호화, 사용자 비밀번호 암호화하기 (0) 2022.01.16