이번 멋북스 프로젝트의 ebook reader에서는 REST api를 구현하고, 거기에 더해 JWT토큰을 인증에 사용한다.
사용하고, 프로젝트에 적용할 수는 있지만 깊게 이해하지 못하고 사용하는 것을 찜찜하다는 생각이 들어서 JWT가 무엇이고, 왜 사용하는지, JWT의 장단점에 대해서도 알아보며 이 글을 써보려 한다.
참고 : Dev Scroll
먼저 jwt를 파보기 전에 인증가 인가는 간단하게 짚고 넘어가자.
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
출처 : Dev Scroll
위의 헤더, 페이로드, 서명 등의 정보를 인코딩(Base64 URL-safe Encode)해 아래와 같은 형태로 클라이언트에게 발급한다.
출처 : Dev Scroll
1. 클라이언트가 id, pw와 함께 서버에 로그인을 요청한다.
2. 서버가 요청을 받고, Header, Payload, Signature를 정의하고 Base64로 인코딩(암호화)하여 JWT를 생성해 쿠키에 담아 클라이언트에게 발급한다.
3. 클라이언트는 JWT를 로컬 저장소에 저장하고, 서버에 요청을 보낼 때 Authorization header에 Access Token을 담아서 보낸다.
4. 서버는 클라이언트가 Header에 담아 보낸 JWT가 서버에서 발급한 토큰인지 일치 여부를 확인해 인증을 통과 혹은 거부를 한다.
5~6. 클라이언트의 Access Token의 시간이 만료되면 Refresh Token을 사용해 새로운 Access Token을 발급받는다.
서버는 JWT를 이용해 토큰의 정보를 아는 게 중요한 것이 아니라 클라이언트가 요청과 함께 보낸 JWT가 유효한 토큰인지 검사하는 것이 중요하다.
클라이언트가 보낸 JWT의 Header, Payload를 서버의 key값을 이용해 Signature를 만들어 클라이언트가 보낸 Signature와 일치하는지 확인하고 일치하면 인증을 통과시킨다.(인가)
토큰의 진짜 목적은 정보 보호보다는 위조 방지이다.
Tip
서버에서 가장 피해야 할 것은 DB 조회이다.
서버가 죽는 경우 중 대부분은 DB가 터져서 서버도 같이 죽는 경우이다.
이와 관련해서 JWT는 DB조회가 필요없다는 장점을 가지고 있다.
장점 | 단점 | |
---|---|---|
Cookie & Session | 1. Cookie만 사용하는 방식보다 보안 향상 2. 서버 쪽에서 Session 통제 가능3. 네트워크의 부하가 낮음 | 세션 저장소 사용으로 인한 서버의 부하 |
JWT | 1. 인증을 위한 별도의 저장소가 필요 없다. 2. 빠른 인증 처리 3. 확장성 우수 | 토큰의 길이가 길수록 네트워크의 부하가 증가, 특정 토큰을 강제로 만료시키기가 어렵다. |
JWT에 대해서 공부하고 정리하며 어느 정도 JWT에 대해 이해가 되었다.
하지만 JWT를 공부하다 보니 Access Token, Refresh Token에 대해서 알게 되었다. 현업에서는 이런 방식을 주로 사용한다고 하니, 좀 더 파봐야겠다.