본문 바로가기

웹 개발

웹 개발 공부하기 3 - 과제 (jwt)

1. jwt 공부하기

 

jwt란? JSON Web Token의 약자로 이름처럼 json형식의 웹에서 사용하는 토큰입니다.

이 jwt는 주로 회원인증할 때 많이 사용되기때문에 우리가 이번주에 배운 로그인 로직 만들기에 포함시킬 수 있습니다.

즉, 세션 대신해서 사용할 수 있습니다.

 

jwt에 대해 알아보겠습니다.

jwt는 xxxxx.yyyyy.zzzzz  형태로 '.' 으로 3부분을 구분하고 앞에서부터 헤더, 페이로드, 서명부분입니다.

그리고 jwt는 json형식의 토큰답게 각 부분은 json 형식으로 구성되고 base64url으로 인코딩되어 있습니다.

 

json을 간단히 설명하면, json은 아래와 같은 형태를 가지고,

{

    "키": "값",

    :

    "키": "값"

}

예시처럼 객체 문법을 따르는 문자형태로 존재합니다. 그렇기 때문에 이 문자를 객체화하여 (키: 값)데이터로 사용할 수 있습니다.

 

이제 각 부분의 역할?? 포함되는 데이터를 알아보겠습니다.

첫번째 헤더 부분은 일반적으로 토큰 유형(JWT)과 서명부분에서 사용되는 서명 알고리즘으로 구성됩니다.

- { "alg": "HS256", "typ": "JWT" } 로 입력할 수 있습니다.

jwt header

위에는 실제 오른쪽값을 jwt로 만들어 준 것입니다.

실제 오른쪽 값을 base64url 인코딩을 하면 왼쪽의 헤더 부분과 같은지 확인 해보겠습니다.

헤더부분 인코딩

와!! 정말 json을 인코딩한 값이 들어간 것을 확인할 수 있습니다.

 

두번째 페이로드 부분은 클레임을 포함합니다. 클레임은 엔터티(일반적으로 사용자) 및 추가 데이터에 대한 설명입니다. 

즉, 실제 토큰에 저장할 데이터라고 보면 될 것 같습니다. 

이 클레임은 등록된 클레임 , 공개 클레임 , 비공개 클레임 의 세 가지 유형이 있고,  각 클레임을 보면

등록된 클레임:  미리 정의된 클레임 집합으로 필수는 아닙니다. ex) iss (발행자), exp (만료 시간), sub (주제), aud (청중) .

공개 클레임: jwt사용자가 마음대로 정의할 수 있는 클레임입니다.

비공개 클레임: 사용에 동의한 당사자 간에 정보를 공유하기 위해 생성된 클레임으로 등록, 공개 클레임이 아닌 것입니다.

 

페이로드 부분도 실제 인코딩하면 같은 값이 되는 지 확인해봐야겠죠?

jwt payload
페이로드 부분 인코딩

여기도 마찬가지로 똑같은 값이 나오네요.ㅎㅎ

하지만 헤더부분과 페이로드 부분은 base64url 디코딩만 한다면 내용을 알 수 있고 그렇기 때문에 전송 시 비밀번호같은 중요한 정보는 포함하면 안됩니다.

 

마지막 서명 부분은 앞의 두 부분이 변경되었는지 확인하는 부분으로 개인키로 서명 시 서명자를 확인할 수 도 있습니다.

앞의 헤더와 페이로드 부분을 . 과 함께 이어 '인코딩된 헤더.인코딩된 페이로드' 를 헤더에서 정의한 서명 알고리즘과 서명키로 서명한 부분입니다.

 

서명도 실제 설명한 것처럼 동작하는지 확인해보겠습니다.

일단 우리가 헤더에 적어준 HS256알고리즘은 HMAC-SHA-256알고리즘이란 뜻입니다.

 

역시나 제대로 나오는 모습!! 

그렇기 때문에 만약 중간에서 누군가 jwt를 변경하여도 변경사실을 알 수 있습니다.

 

이제 jwt 무엇인지, 그리고 구성에 대해 알아보았습니다.

그럼 jwt를 어떻게 주고 받을까요?

jwt 사용

 

세션과 다를게 없습니다.

1. 사용자가 로그인을 시도한다.

2,3. 서버는 사용자가 로그인 성공 시 jwt 토큰을 만들어 클라이언트에게 전송한다.

4. 사용자가 다음 요청 시 jwt를 함께 전달한다.

5,6. 서버는 jwt가 올바른 것인지 서명체크 후 jwt를 보면 사용자가 누군지 알 수 있고, 요청에 대한 응답을 한다.

 

클라이언트가 jwt를 전달할 때 http 헤더에 포함시켜 보냅니다.

 

다음 블로그에선 이 jwt를 사용하여 로그인 페이지를 만들어보도록 하겠습니다.