ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT(Jason Web Token)
    express 2022. 1. 20. 00:00

    JWT

    Authentication 인증 로그인/ 일정 권한이 주어진 사용자임을 id pw등을 통해
    인증받는것

    Authorization 로그인이 유지되는 상태에서 일어나는 일
    한번 인증을 받은 사용자가 이후 서비스의 여러 기능들을 사용할 때 
    로그인후 친구의 목록을 보거나, 내 담벼락에 글을 작성하거나,
    친구게시물에 내아이디로 좋아요나 댓글달기와 같이 내 계정으로만 할 수 있는 활동을 시도할 때
    페북이 내가 로그인 되어있음을 알아보고 허가를 해주는것


    로그인이 생각보다 무거운 작업
    이를 반복하지 않기 위해서 session이란게 나왔다.


    쿠키(브라우저에 저장되는 정보)

    세션: 어떤 사용자가 서버에 로그인이 지속적으로 되어있는 상태를 session이라고 함
    사용자가 로그인에 성공하면 서버는 '세션표딱지'를 출력
    절반은 서버(메모리, 서버, DB등 설정하기 나름), 절반은 사용자 브라우저로 보냄
    표반쪽을 가진 브라우저(크롬)가 이 표를session ID란 이름의 쿠키로 저장

    이 브라우저는 앞으로 로그인된 사이트에 요청을 보낼 때 마다 이 표딱지를 실어보냄

    서버는 이 표딱지 반쪽와 맞는 짝이 있는지 확인해서 있으면 authorization을해줌.

    JWT 전체흐름 https://github.com/bezkoder/node-js-express-login-example?ref=bestofreactjs.com

     



    JWT를 사용하는 서비스에서는 사용자가 로그인을 하면 토큰이라는 표를 출력해서 건네줌.
    이번에는 찍어서 주지 않고 그냥줌. 즉 서버가 뭔가를 기억하고 있지 않음.
    토큰: 인코딩 또는 암호화된 3가지 데이터를 이어 붙인것

    1번 헤더, 2번 페이로드, 3번 서명

    jwt 공식 홈페이지 설명


    페이로드: base64로 디코딩해보면, 
    토큰발급처,
    토큰유효기간,
    서비스가 제공하길원하는정보: 사용자의 닉네임, 서비스레벨, 관리자레벨등등
    이런것들을 클레임Claim이라고함

    사용자가 로그인을 하고나서 받는 토큰에 이 정보들이 클레임이라는 걸로다가 실려옴. 
    이를 위조하는게 가능하지 않냐? 그걸막기위해 1번 3번이 있음

    1번 헤더의 구성:
    type:JWT와 
    alg(알고리즘): 3번 서명값을 만드는데 사용될 알고리즘

    1번헤더와 2번 페이로드, 서버에 감춰놓을 비밀값 이 셋을 암호화 알고리즘에 넣고 돌리면 3번값이 나옴

     

     

     

    미들웨어. verifyJWT메소드안에서 req.headers로 받는다. 토큰과 비밀값을 넣고 디코딩
    104번째 줄에 jwt.sign(id ,서버에 감춰놓은 비밀값) 
    118번째 줄이 정상적으로 실행되면 로그인시 토큰이 프론트로 넘어온다(pw는 실제프로젝트를 할 때 절대 프론트로 넘겨주면 안된다.)

    이처럼 시간에 따라 바뀌는 어떤 상태값을 안 갖는걸 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

Designed by Tistory.