JWT(Json Web Token)란?

dev-log·2021년 9월 16일
0
post-custom-banner

인증과 인가


인증 (Authentication)
: 사용자를 확인하는 것, 사이트에 가입된 회원임을 아이디와 비밀번호 같은 방법을 통해 인증하는 것(쉽게 말해 로그인)
인가 (Authorization)
: 인증을 받은 사용자가 웹 사이트가 제공하는 서비스에 여러 가지 기능을 사용할 권한을 허가해주는 것 (로그인 이후의 활동)

이러한 인가를 도와주는 기술이 세션 기반 인증 방식JWT이다.

Session 기반 인증 방식

1. 클라이언트가 사이트에 로그인 
2. 로그인에 성공하면 서버가 유저 세션을 만들고 메모리나 데이터베이스에 저장한다.
3. 서버가 클라이언트에게 세션 ID를 전달한다.
4. 클라이언트의 브라우저에 세션의 ID만 쿠키에 저장하게 한다.

사용자의 정보가 서버의 메모리에 저장되므로 너무 많은 접속이 있으면 서버가 터질 수 있다. 규모 확장이 필요 없는 소규모 프로그램 작성에 적합하다.

JWT

: JWT(JSON Web Token)
토큰 기반 인증 방식으로, 클라이언트의 세션 상태를 저장하는 것이 아니라 필요한 정보를 토큰 body에 저장해 서버가 클라이언트에게 주고 서버는 저장하지 않고 클라이언트가 가지고 있다가 필요할 때마다 그것을 증명서처럼 사용한다.

기본 형식

xxxxx.yyyyy.zzzzz

마침표로 끊어서 3가지로 나뉜다.
1. Header(xxxxx)
토큰의 타입이나 암호화할 때 사용된 해시 알고리즘이 무엇인지 들의 정보가 담긴다.
2. payload(yyyyy)
사용자에 대한 정보를 담고 있다. base64로 인코딩되어 있다.
3. Signature(zzzzz)
header에서 지정한 알고리즘과 secret 키, 서명으로 payload와 header를 담는다.

1. 클라이언트가 사이트에 로그인 
2. 서버는 사용자 정보를 확인한 후 Secret Key를 활용해 JWT를 생성한다.
3. 서버가 클라이언트에게 JWT를 전달한다.
4. 브라우저에 JWT를 저장한다. 
+ 이후 인증 방식 
클라이언트가 서버에게 서비스 요청과 권한을 확인하기 위해 헤더에 JWT를 전달한다. 
서명 값도 일치하고 만료 시간도 지나지 않았다면 클라이언트에게 요청에 대한 응답을 전달한다.

JWT의 단점

하지만 JWT는 통제가 어렵고 토큰 자체에 사용자에 대한 정보를 담고 있기 때문에 보안성이 취약하다.

해결방법

만료 시간을 아주 짧게 줘서 수명을 짧게 준다. 하지만 만료시간을 너무 짧게 주면 계속 다시 인증해야 하는 불편함이 있다. 이때 사용하는 것이 Refresh Token이다.

사용자에게 JWT를 발급하면서 access token, refresh token 2가지를 준다.
access token은 1-2일 정도로 기간을 짧게 주고 refresh token은 2주 정도로 기간을 길게 준다. 클라이언트에게 2개의 token을 주면서 refresh token만 데이터베이스에 따로 저장하고 이후 access token이 만료되면 refresh token을 이용해 새 access token을 발급받는다.

이러한 JWT의 한계 때문에 JWT는 편리한 기술이지만 완전히 JWT만을 사용하는 곳은 많지 않다.

Reference

https://yonghyunlee.gitlab.io/node/jwt/
https://youtu.be/1QiOXWEbqYQ
https://velog.io/@sj950902/%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%9D%B8%EA%B0%80%EB%A5%BC-%ED%95%B4%EB%B3%B4%EC%9E%90-feat.-JWT
https://mangkyu.tistory.com/76

profile
배운 걸 기록하는 곳입니다.
post-custom-banner

0개의 댓글