session
session 생성 방식
session 사용 방식
jwt
Header(base64 인코딩 됨)
Payload(base64 인코딩 됨)
Signature(base64 인코딩 됨)
JWT
는 DB에 저장 X
, Signature로 검증
, 검증시마다 DB접근 X
jwt 생성 방식
jwt 사용 방식
데이터 요청
session
jwt
session과 jwt를 비교한 내용입니다.
Header는 알고리즘과 토큰의 타입을 보여줍니다. 그리고 Payload는 데이터를 보여줍니다.
signature는 Base64로 인코딩된 Header와 Base64로 인코딩된 Payload를 합치고 secret키를 같이 합쳐서 SHA256으로 바꿔 만들어지게 됩니다.
refresh와 access 모두 JWT 기반 토큰
(id, pw) => base64 encoded => token
HEADER {authorization: "Basic {token}"}
형태로 전송(id, pw) token
Basic 제거
base64 decoded
username:password 형태로 split
access token, refresh token
제공Access token 재발급 요청 URL
HEADER authorization: "Bearer {refresh token}"
으로 보내기(id, pw)
검증access token 재발급
토큰 전송
API 요청
HEADER authorization: "Bearer {access token}"
으로 보내기(id, pw)
검증데이터 요청
데이터 응답
데이터 응답
access + refresh
API 요청
access token
검증access token 만료, 401
access token 재발급 URL 요청
refresh token
refresh token
검증access token
응답새로운 access token
으로 재요청데이터 요청
데이터 응답
데이터 응답
암호화 알고리즘 종류는 다양합니다.
변경된 문자를 Hash
라고 합니다. 그리고 Bcrypt를 많이 사용하는 이유는 느리기
때문입니다.
해커들을 Dictionary attack
을 할 수 있습니다. 해커는 아래의 사진처럼 만들어두고 프로그램으로 계속 돌리는 것입니다.
그래서 bcrypt는 이를 방지하기 위해서 salt
를 사용합니다. salt
를 통해서 보호하는 것입니다. 그러면 완전 다른 문자가 나오게 됩니다.
만약 salt
까지 털릴 수 있습니다. 그래서 앞서말한 bcrypt가 느린 이유가 나옵니다.
물론 털릴 수 있지만 salt와 DB를 털고 Dictionary 테이블을 만들기까지 너무나 오랜시간이 걸립니다. 따라서 사실상 불가능합니다. 그래서 bcrypt의 장점이됩니다. 원하는 만큼 느리게 만들 수 있습니다. 하지만 물론 사용자 또한 로그인을 할 때 오래걸리게 됩니다.
따라서 중간 지점을 찾아야 합니다.
user정보 확인시
session은 client에서 인증정보 읽기 불가능
하다. 왜냐하면 session
은 random string
이기 때문이다. 그렇기 때문에 의미있는 데이터는 DB 세션영역
에 있기 때문에 조회해야한다.
하지만 JWT의 경우 token 내부에 인증에 필요한 데이터가 base64로 인코딩되어서 존재
한다. 따라서 헤더에 있는 데이터를 디코딩
해서 가져오면된다.
session의 경우는 사용자의 정보가 DB에 있으므로 수평적확장을 할때 모든 접근시 똑같은 session을 바라보도록 만들어야하기 때문에 resource가 많이 들어 수평적 확장이 어렵다.
하지만 상대적으로 jwt의 경우, 사용자의 정보가 토큰에 담겨있기 때문에 session에 비해 상대적으로 수평적확장이 쉽다.