본문 바로가기

해킹-보안

jwt(JSON Web Token) 개념

반응형
  • Authentication(인증): 로그인을 통해 특정 서비스에 권한이 존재하는 사용자임을 인증받는 것
  • Authorization(인가): 사용자가 인증을 받은 이후 그 사용자가 특정 기능에 접근 여부를 결정하는 것


기존의 인가 방식
o 서버는 로그인한 사용자에게 세션을 발행하여 서버 메모리에 저장 후 클라이언트는 해당 세션을 브라우저에 저장
o 인가가 필요한 요청을 보낼 때 서버에 세션 값을 전달, 서버는 메모리 확인 후 요청받은 세션이 일치하면 인가
o 단점은 동시 다중 접속 시 메모리 부족, 분산된 서버라면 세션 유지가 제대로 안되서 서버 확장도 힘듬

jwt 방식
o jwt(JSON Web Token)는 Json 포맷을 이용해 사용자에 대한 속성을 저장하는 웹 토큰
o 사용자가 로그인 시 서버에서 토큰을 부여하는데 이 토큰을 서버에 저장하지는 않음
o jwt도 세션과 동일하게 브라우저 쿠키에 토큰이 저장됨
o jwt 토큰에는 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용을 담는다.
ex) 토큰 발행자, 토큰 유효 기간, 사용자 닉네임, 서비스 권한, 관리자 여부 등 토큰에 담긴 사용자 정보 등이며
이를 클레임(clame)이라고 함
o jwt는 시간에 따라 바뀌는 상태값이 아니므로 stateless, 세션은 statefull
o jwt와 세션은 인증보다는 인가에 연관된 기술


jwt 구성
각 구분은 마침표(.)로 나눠 표현되며, 각 값은 BASE64로 인코딩된 데이터를 이어붙인 형태로 구성된다.
JWT는 일일이 현재 로그인한 사용자를 저장하지 않아도 저 토큰을 연산에 돌려보기만 하면, 서버가 발급한 토큰인지
변조된 토큰인지 확인 가능하다.

헤더 - 알고리즘(서명 값을 만드는데 사용될 알고리즘, ex) hs256, 헤더에는 type이 들어가는데 언제나 JWT로 사용한다.
페이로드 - 토큰이 갖는 데이터
서명 - 헤더에 정의된 알고리즘을 통해 암호화한 비밀 값으로 서버만 알고 있음,
서버는 요청에 토큰 값이 실려들어오면, 헤더와 페이로드 값을 서버의 비밀키와 함께 돌려봐서 계산된 결과값이
서명값과 일치하면 인가함. jwt 페이로드를 조금이라도 변조할 경우 서명 값이 달라짐 



jwt는 세션 대체 가능? No
o JWT는 세션처럼 모든 사용자들의 상태를 저장하지 않는다.
o 세션을 이용한 경우 한 기기에서만 로그인 가능한 서비스를 만들고 싶다면, pc에서 로그인하면 핸드폰에서의
세션값은 사용못하게 하는 등 제어할 수 있지만 JWT는 이미 줘버린 토큰을 뺏을 수가 없음.
o 해커에게 토큰을 탈취당해도 토큰을 무효화할 방법도 없음.

o 해결방법
로그인시 accessToken, refreshToken 두 개의 토큰을 부여한다.
accessToken - 매번 인가를 받을 때 사용하는 토큰. (보통 수명이 짧음)
refreshToken - accessToken의 수명이 만료되면 accessToken을 재발행 받기 위한 토큰이다.
refresh 토큰은 보통 2주정도 기간이 길게 잡힌다. 누군가를 로그아웃시키려면
refeshToken을 db에서 지워버리면 되는데 그래도 accessToken의 수명 동안은 바로 차단할 방법은 없음

o 추가 보안으로 쿠키를 못 훔치도록 HTTP Only 를 걸어서 자바스크립트로 접근 못 하도록 하고
CORS 등의 여러 다른 방법들도 사용할 것, 로컬스토리지에 넣으면 스크립트로 접근이 가능해져서 위험함
 
※ 자료 참고 
https://www.youtube.com/watch?v=1QiOXWEbqYQ

 

반응형

'해킹-보안' 카테고리의 다른 글

webgoat Authentication Bypasses  (0) 2021.12.14
webgoat jwt tokens 4~5  (0) 2021.12.09
엑셀 VBA 프로젝트 암호 보호 해제  (0) 2021.09.08
exploit package  (2) 2021.09.05
Print Spooler(CVE-2021-1675) exploit  (0) 2021.09.05