session

session 생성 방식

session 사용 방식

jwt

Header(base64 인코딩 됨)Payload(base64 인코딩 됨)Signature(base64 인코딩 됨)JWT는 DB에 저장 X, Signature로 검증, 검증시마다 DB접근 Xjwt 생성 방식

jwt 사용 방식

데이터 요청session

jwt

session과 jwt를 비교한 내용입니다.



Header는 알고리즘과 토큰의 타입을 보여줍니다. 그리고 Payload는 데이터를 보여줍니다.
signature는 Base64로 인코딩된 Header와 Base64로 인코딩된 Payload를 합치고 secret키를 같이 합쳐서 SHA256으로 바꿔 만들어지게 됩니다.

refresh와 access 모두 JWT 기반 토큰
(id, pw) => base64 encoded => tokenHEADER {authorization: "Basic {token}"} 형태로 전송(id, pw) tokenBasic 제거base64 decodedusername:password 형태로 splitaccess token, refresh token 제공
Access token 재발급 요청 URLHEADER authorization: "Bearer {refresh token}"으로 보내기(id, pw) 검증access token 재발급토큰 전송
API 요청HEADER authorization: "Bearer {access token}"으로 보내기(id, pw) 검증데이터 요청데이터 응답데이터 응답access + refresh

API 요청access token 검증access token 만료, 401access token 재발급 URL 요청refresh tokenrefresh 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에 비해 상대적으로 수평적확장이 쉽다.