서버 인증 (2) (token/JWT)

token / JWT Authorization

Posted by 동식이 블로그 on January 11, 2020

서버 인증 (2) (Token, JWT)

Token 인증

  • 세션 기반 인증과는 다르게 사인한 토큰을 이용하여 인증을 수행한다
  • 세션 인증과는 다르게 stateless 서버를 사용하며, 상태정보를 유지하지 않는다

JSON Web Token(JWT)

  • JWT는 인증 헤더 내에서 사용되는 토큰 포맷으로써, Base64로 인코딩한 String으로 이루어져 있다
  • JWT는 토큰 자체가 의미를 갖는 Claim 기반의 토큰으로 권한과 인증의 역할을 가질 수 있다. 즉, JWT는 JSON 객체에 요구사항을 작성하고, 어떠한 암호화 방식을 사용해서 문자열로 인코딩을 한 후, HTTP Header에 추가함으로써 사용자 인증을 요청한다. 서버에서는 이 토큰을 확인한 후 디코딩하여 사용자를 인증하게 된다.

인증과정

token1

  1. 사용자가 로그인을 한다
  2. 서버에서는 로그인 정보를 읽어 사용자를 확인한 후, DB에 없으면 저장한다
  3. 해당 계정에 대해 JWT를 발급한다
  4. 서버는 사용자에게 JWT를 전달해준다
  5. 사용자는 전달받은 JWT를 인증이 필요한 요청마다 헤더에 실어 요청한다
  6. JWT를 검증한다
  7. 검증이 완료되면 요청에 대한 응답을 한다

JWT의 장점

  • 계정 서버와 API 서버가 분리되어 있을 때, API 서버가 계정 서버에게 토큰의 유효성 여부를 물어보지 않고도 스스로 판단할 수 있다
  • 따라서 서버 입장에서 요청을 받았을 때 발급한 후 검증만 하면 되기 때문에 추가 저장소가 필요없으며, 수평으로 쉽게 확장이 가능하다는 의미가 된다
  • 토큰 기반 다른 인증 시스템에 접근이 가능하다(Facebook, Google등)

단점

  • 이미 발급된 JWT에 대해서는 돌이킬 수 없다는 점인데, 이는 한 번 발급되면 유호기간이 완료될 때 까지는 계속 사용이 가능해서 악의적인 사용자가 이를 탈취해 유효기간이 지나기 전까지 정보들을 춤쳐갈 수 있다.
    • 이에 대한 해결책으로 Refresh Token을 이용한다
  • Payload 정보가 제한적이므로 디코딩하면 누구나 정보를 확인할 수 있다. 따라서 유저의 중요한 정보들은 Payload에 넣을 수 없다
  • 세션/쿠키 방식에 비해 JWT의 길이가 길기 때문에 요청이 많아지면 많아질수록 서버의 자원낭비가 발생하게 된다

참고사이트