JWT와 인증

JWT란?

JSON Web Token의 약자로, 말 그대로 JSON을 이용한 웹 토큰입니다.

서버와 클라이언트 간 정보를 주고 받을 때 http header에 토큰을 넣으면

서버에서는 헤더에 포함된 토큰의 정보를 통해 인증을 하게 됩니다.


세션 기반 인증 vs 토큰 기반 인증

  • 세션 기반 인증 방식

클라이언트가 로그인에 성공하면 서버에서는 클라이언트를 구별하기 위해 유니크한 세션 id를 부여하고,

세션 저장소에 유저의 정보를 저장한 후에 클라이언트에게 id를 발급합니다.

클라이언트는 세션id를 쿠키에 저장한 후 요청을 보낼 때 마다 쿠키를 헤더에 실어 보냅니다.

  • 토큰 기반 인증 방식

클라이언트가 로그인에 성공하면 서버에서 클라이언트에게 토큰을 넘겨줍니다.

클라이언트는 토큰을 저장한 후 요청을 보낼 때 마다 HTTP request header에 토큰을 담아서 보냅니다.



두 방식의 차이점은 세션 방식에서는 유저의 정보를 유지하기 위해 별도의 세션 서버를 필요로 한다는 점이 있습니다.

JWT

실제로 서버로부터 전송받은 JWT는 아래와 같이 생겼습니다.

이는 json을 base64로 인코딩했기 때문에 이런 식으로 보이는 것입니다.

실제로 jwt.io에서 이런 토큰들을 디코딩 시켜 볼 수 있습니다.

위 토큰을 디코딩 한 결과는 아래와 같습니다.

헤더와 내용, 서명 3등분으로 나뉘어져 있습니다.

헤더에서는 typ과 alg 두가지 정보가 들어있습니다.

typ는 토큰의 타입, 즉 JWT겠죠?!

alg에는 해싱 알고리즘을 지정합니다. 위 예제에서는 HS256이 사용되었네요!

Payload

페이로드에는 토큰에 담을 정보가 들어있습니다.

위 예제에서는 user_id : 9 부분이 되겠네요!

signature

서명에는 헤더의 인코딩값, payload의 인코딩값을 합친 후 비밀키로 해쉬를 하여 생성됩니다.


Written by@Mengkki
common fangirl

GitHub