JWT (JSON WEB TOKEN)

Jiwon·2022년 1월 3일
0

HTTPS&SSL

목록 보기
6/7

JWT (Json Web Token)

로그인한 유저의 정보를 유지시키고 싶다.
그런데 유저 아이디 값을 쿠키로 저장하니 변경이 가능해서 안전하지 않고,
서버 쪽 세션을 만들어서 저장해 그 키 값을 쿠키로 내려주자니 너무 많은 저장공간이 필요.

공개된 정보를 내려주되, 이 값이 변조되지 않았다는 것을 증명하는 암호문도
같이 내려주면 되지 않을까?

내용의 부분을 데이터 포맷에서 많이 사용되는 JSON 형식으로 내려주기로 했다.
그래서 Json Web Token.

웹 통신 상 빈칸이라던지 특수기호 등의 데이터는 손실이 될 가능성이 있다.
이런 손실 가능성이 있는 형식의 데이터를 안전하게 전송하기 위해서는 Base64라는 인코딩 방법을 사용한다.

인코딩이란,
정보의 형태나 형식을 여러가지 목적에 따라 (저장 공간, 데이터 표준화, 보안, 퍼포먼스 등)을 위해서 다른 형태나 형식으로 변환하는 처리 방법을 의미.
-> 손실 없이 데이터를 주고 받기 위해서는 Base64로 인코딩한다는 의미이다.


토큰 : 특정 데이터를 들고 다니는 객체
헤더 : 토큰의 종류와 사용된 알고리즘
내용 : 토큰을 통해 클라이언트에게 저장/전달 해주고 싶은 정보
서명 : 인증하기 위한 증명서
iat : issue at (언제 발행 되었느냐)
sub : 누군가로부터 토큰을 발행했는지, 누구로부터 토큰을 발행 해줬는지에 대한 정보 (특정 유저 아이디를 적는 것이 관례)

헤더와 내용은 JSON 형식이지만 이를 안전하게 전달하기 위해서 Base64 형태로 인코딩 한다.
인코딩 한 헤더와 내용을 특정 암호화 알고리즘을 통해서 암호화시켜 서명으로 사용.

서명 부분을 복호화 했을 때의 값이 헤더 + 내용과 일치하다면
올바른 토큰이라는 것을 증명할 수 있다.
이를 자가 수용적(self-contained)라고 표현한다.

JWT는 필요한 모든 정보를 자체적으로 지니고 있다.
토큰에 대한 기본정보(헤더),
전달하고 싶은 정보(내용),
토큰이 검증 됐다는 것을 증명서까지 포함(서명)

이런 모든 정보를 들고 있다면 굳이 세션이란 데이터를 서버에 저장하거나
쿠키를 통해서 위변조 됐는지 걱정할 필요도 없이 JWT 하나만을 이용해서
정보를 안전하게 보낼 수 있을 뿐더러
이 정보가 위조 됐는지, 변조 됐는지, 여부를 서명을 통해서 할 수 있게 되는 것.


내용을 변경하게 되면 서명 부분이 바뀌는데
왜 그러냐면, 앞에 있는 곳이 일치하는가를 증명하는 증빙서류이기 때문이다.


체크한 부분이 비밀키.
특정키 값을 이용해서 암호화하고 복호화 한다.
지금 암호화하는 기법은 대칭키 암호화 알고리즘의 하나로 HS256이라는 방식이여서 키를 암호화하고 복호화 할 수 있다.


JWT에서도 마찬가지로 Private Key와 Public Key를 이용해서 암호화, 복호화 할 수도 있다.

profile
과연 나는 ?

0개의 댓글