서버 인증 (2) (Token, JWT)
Token 인증
- 세션 기반 인증과는 다르게 사인한 토큰을 이용하여 인증을 수행한다
- 세션 인증과는 다르게 stateless 서버를 사용하며, 상태정보를 유지하지 않는다
JSON Web Token(JWT)
- JWT는 인증 헤더 내에서 사용되는 토큰 포맷으로써, Base64로 인코딩한 String으로 이루어져 있다
- JWT는 토큰 자체가 의미를 갖는 Claim 기반의 토큰으로 권한과 인증의 역할을 가질 수 있다. 즉, JWT는 JSON 객체에 요구사항을 작성하고, 어떠한 암호화 방식을 사용해서 문자열로 인코딩을 한 후, HTTP Header에 추가함으로써 사용자 인증을 요청한다. 서버에서는 이 토큰을 확인한 후 디코딩하여 사용자를 인증하게 된다.
인증과정
- 사용자가 로그인을 한다
- 서버에서는 로그인 정보를 읽어 사용자를 확인한 후, DB에 없으면 저장한다
- 해당 계정에 대해 JWT를 발급한다
- 서버는 사용자에게 JWT를 전달해준다
- 사용자는 전달받은 JWT를 인증이 필요한 요청마다 헤더에 실어 요청한다
- JWT를 검증한다
- 검증이 완료되면 요청에 대한 응답을 한다
JWT의 장점
- 계정 서버와 API 서버가 분리되어 있을 때, API 서버가 계정 서버에게 토큰의 유효성 여부를 물어보지 않고도 스스로 판단할 수 있다
- 따라서 서버 입장에서 요청을 받았을 때 발급한 후 검증만 하면 되기 때문에 추가 저장소가 필요없으며, 수평으로 쉽게 확장이 가능하다는 의미가 된다
- 토큰 기반 다른 인증 시스템에 접근이 가능하다(Facebook, Google등)
단점
- 이미 발급된 JWT에 대해서는 돌이킬 수 없다는 점인데, 이는 한 번 발급되면 유호기간이 완료될 때 까지는 계속 사용이 가능해서 악의적인 사용자가 이를 탈취해 유효기간이 지나기 전까지 정보들을 춤쳐갈 수 있다.
- 이에 대한 해결책으로 Refresh Token을 이용한다
- Payload 정보가 제한적이므로 디코딩하면 누구나 정보를 확인할 수 있다. 따라서 유저의 중요한 정보들은 Payload에 넣을 수 없다
- 세션/쿠키 방식에 비해 JWT의 길이가 길기 때문에 요청이 많아지면 많아질수록 서버의 자원낭비가 발생하게 된다
참고사이트