[인증/보안] 세션 vs 토큰 JWT
인증 Authentication 과 인가 Authorization
인증 Authetication :
쉽게말해 로그인. 내가 이사이트에 가입된 회원임 일정 권한 주어진 사용자임을 아이디 패스워드를 통해서 인증
인가 Authorization :
로그인 후! 내계정으로만 할 수 있는 서비스 사용할때 (로그인완료된 후 ). 인증을 받은 사용자가 서비스 안에서 돌아댕길때 서버가 아 얘가 로그인한 애네? 응 어서와~ 하고 허가해줌
세션의 허점?
다음을 예로들면 지금도 유저는 뉴스, 웹툰 등 링크 클릭하고있음
웹사이트상에선 이 클릭들이 모두 get요청
동시다발적으로 get요청을 서버가 받음
어떤이들은 => 로그인 됨
어떤이들은 => 비회원으로 사용
로그인이 필요한 기능들이있다 : 댓글달기, 블로그 쓰기 등등 <- 허용해줄지 말지 응답해야됨!
로그인 기능? 꽤 무거운 작업. <- 알고리즘도 빡시고 데이터베이스에서 뭘 꺼내오는것도 무리쓰~! 보안상 매 요청마다 아이디비번이 돌아댕기면 안좋기도함
사용자가 로그인 성공? 서버 '세션표딱지' 출력
이걸 찢어서
반쪽은 사용자 브라우저에 옛따! => 브라우저 sessionId라는 이름으로 쿠키에저장 (쿠키란게 브라우저에 저장되는 정보)
서버에 책상 = 메모리, 하드디스크, 데이터베이스에 넣어둠
이제 명찰 즉, 쿠키에 세션아이디가 실려오면 서버는 그걸 맞는 짝이 있으면 어서왕~! 어떨라이제이션 해줌
에러라는 원숭이 출연!

책상을 엎으면? 즉 서버가 재부팅 되야하는 상황? 메모리 휘발됨
로그인 튕겨짐
서버가 여러대있다 로그인은 1번 서버 컴에 연결되고 그다음 이메일요청은 3번 서버?
그럼 세션 유지가 제대로 안됨...쩝..
서버가 복잡한 상황과 구성에서 어떤상태를 기억해야되는것 되게 설게하기 어려운것
이걸 해결하려고 고안된게 TOKEN방식 JWT = json web token
토큰 TOKEN / JWT
인가와 관련된 기술
로그인하면 이번에는 토큰이라는 표딱지를 줌
찢지않고 그냥줌. ? => 서버가 기억을 안한다는 말
알파벳 숫자 아무렇게나 막 섞여있다.
인코딩 또는 암호화된 3가지 데이터를 이어붙인거
페이로드 Payload
이걸 base64로 디코딩해보면? JSON형식으로 여러가지 정보가 담겨있다.
누가 누구에게 발급? 언제까지 유효? 서비스가 사용자에게 정보공개하는 레벨 등을 담고있다. (서버에서 원하는대로)
그러면 토큰을 보고 생각하는거지. 굳이 데이터베이스가서 일일이 뒤져볼필요가없어짐
그러면 이걸 조작해서 악용할수있지않낭
토큰 유효기간 50년, 관리자 권한으로 인가받아버리고 ㅋㅋㅋ
그.래.서 헤더랑 서명이 있듬
헤더 Header / Signature 서명
디코딩 해보면 두가지 정보가있다.
1번 타입
2번 alg = 알고리즘 = 마지막 3번 서명값을 만들때
1번 헤더+ 2번 페이로드 + `서버에 감춰놓은 비밀값` <- 알고리즘에 넣고 돌리면 = 서명값
토큰 쌔벼서 봐도 알고리즘 모르면?
글자하나만 바껴도 서명값이 달라짐.
서버: 토큰값이 들어옴? 1,2번의값을 서버의 비밀값으로 돌려봐서 서멍값과 일치? 로그인된 회원으로 인가를 받음
서버는 비밀값만 손에 쥐고있으면됨. 토큰 삑삑 스캔 삐이익 사용자 걸러냄
세션 vs JWT
한 기기에만 로그인되게하련다.
PC에서 로그인된 사용자가 핸드폰으로 또 로그인하면
PC에서는 로그아웃하도록 할수 있음 => 세션아이디 삭제 ! (req.session.destroy) 표딱지 버림
토큰에서는 ?
뺏을수도없고.
내가쥐고있지않아서 편하긴한데 통제가 불가능하네..
근데 상태를 기억해두려고한다? (req.session.save) => 세션이랑 똑같아서 의미없네
그래서 JWT도 문제가 있다는 의미
그래서 로그인하면 토큰 2개줌
수명이 짧은 access 토큰 = 매번 인가를 받을때마다 쓰는 수명 짧은애
비교적 긴 refresh토큰 = 액세스 토큰 재발급받을때 쓰는거(서버는 그상응값을 데이터베이스에 저장)
손님 에세스 토큰 수명이다하면 리프레쉬토큰을 보냄.
서버는 저장된값과 비교해보고 맞으면 새 에세스토큰 발급. 리프레스 토큰이 유효.할동안은 에세스토큰 수명끝나면 로그인안하고 다시 받음
강제로그아웃시키려면 리프레쉬 토큰을 DB에서 지워버림 토큰갱신이안되게
그치만 짧게나마 액세스토큰이 살아잇으면 이걸 바로 차단할 방법이없음...
그래서 이것이 한계다