JWT
Json Web Token
서버에서 인증된 사용자가 인증을 유지해주는 방법으로 보통은 세션을 사용합니다. 서버 세션을 사용하면 인증된 사용자는 매우 편리하게 서비스를 이용할 수 있고, 대부분의 웹 애플리케이션 서버가 세션을 지원하기 때문에 편리하다.
하지만,
- 서버를 여러대 둘 경우
- 같은 사용자가 서로 다른 도메인의 데이터를 요청할 경우, (SSO) 에는 세션을 유지하기 위한 비용이 매우 커지게 됩니다.
이 때는 서버에 사용자 정보를 저장하는 대신 클라이언트에 사용자 정보를 내려주고, 서버는 토큰의 사용자 정보를 모든 요청에서 확인하고 서비스를 해주는 방식(sessionless)일대, JWT 토큰이 유용하게 사용된다.
- iss : issuer 토큰에 발행한 사람(단체, 사이트)가 누구인지
- sub : Subject 무엇에 관한 토큰인지
- aud : Audience 누구를 대상으로 한 토큰인지
- exp : Expiration 토큰의 만료 시간은 언제인지
- nbf : not before 토큰이 언제부터 유효한지
- iat : issued at 토큰의 발행시간
- jti : JWT ID : 토큰 자체의 아이디(일련번호)
- 그 밖에 인증이 필요하거나 대상서버에서 필요로 하는 데이터
*토큰에 일반적으로 어떤 내용?
- 일반적으로는 인증에 필요한 최소한의 데이터를 넣습니다.
- 비밀번호나 전화번호등을 넣는 것은 안전하지 않습니다.
- 이 토큰은 언제든 공개할 수 있는 정보를 넣는 것이 좋습니다.
- 왜냐하면 서버에서 인증된 키가 아니라도 언제든 서버는 이 토큰을 열어서 그 안에 어떤 claim이 있는지 볼 수 있습니다.
*토큰은 어떻게 관리할 것인가?
- 이론적으로는 토큰을 클라이언트가 관리하게 한다.
- 하지만 실제로 서버는 사용자 정보 캐싱이나 토큰의 유효성 평가, 혹은 refresh 토큰 정책을 위해 서버에 토큰을 관리하기도 합니다.
- 이 경우, 토큰과 사용자 정보를 관리하는 방법으로 다음과 같은 방법들을 사용하기도 한다. ( redis, hazelcast, db저장)