Web/JWT
JWT(Json Web Token)
태윤2
2021. 8. 30. 17:28
JWT란?
- Json Web Token의 약자
- Json 객체를 사용해 가볍고 자가수용적인(self-contained) 방식으로 정보를 안전성 있게 전달해주기 위한 토큰
JWT의 구조
Token 구성 요소
- Header
- alg: Signature 를 해싱하기 위한 알고리즘 정보를 갖고 있음
- typ: 토큰의 타입을 나타내는데 없어도 됨. 보통 JWT를 사용
- Payload
- 서버와 클라이언트가 주고받는, 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있음
- JWT 가 기본적으로 갖고 있는 키워드가 존재
- 원한다면 추가할 수도 있음
- iss: 토큰 발급자
- sub: 토큰 제목
- aud: 토큰 대상
- exp: 토큰의 만료시간
- nbf: Not Before
- iat: 토큰이 발급된 시간
- jti: JWT의 고유 식별자
- Signature
- 서버에서 토큰이 유효한지 검증하기 위한 문자열
- Header + Payload + Secret Key 로 값을 생성하므로 데이터 변조 여부를 판단 가능
- Secret Key 는 노출되지 않도록 서버에서 잘 관리 필요
장단점
- 장점
- 중앙 인증 서버, 저장소에 대한 의존성이 없어서 수평 확장에 유리
- Base64 URL Safe Encoding 이라 URL, Cookie, Header 어떤 형태로도 사용 가능
- Stateless 한 서버 구현 가능
- 웹이 아닌 모바일에서도 사용 가능
- 인증 정보를 다른 곳에서도 사용 가능 (OAuth)
- 단점
- Payload 의 정보가 많아지면 네트워크 사용량 증가
- 다른 사람이 토큰을 decode 하여 데이터 확인 가능
- 토큰을 탈취당한 경우 대처하기 어려움
- 기본적으로 서버에서 관리하는게 아니다보니 탈취당한 경우 강제 로그아웃 처리 불가능
- 토큰 유효시간이 만료되기 전까지 탈취자는 자유롭게 인증 가능
- 그래서 유효시간을 짧게 가져가고 refresh token 을 발급하는 방식으로 많이 사용
토큰 인증 타입
- Basic
- 사용자 아이디와 암호를 Base64 로 인코딩한 값을 토큰으로 사용
- Bearer
- JWT 또는 OAuth 에 대한 토큰을 사용
- Digest
- 서버에서 난수 데이터 문자열을 클라이언트에 보냄
- 클라이언트는 사용자 정보와 nonce 를 포함하는 해시값을 사용하여 응답
- HOBA
- 전자 서명 기반 인증
- Mutual
- 암호를 이용한 클라이언트-서버 상호 인증
- AWS4-HMAC-SHA256
- AWS 전자 서명 기반 인증
Refresh Token
Access Token은 탈취 되더라도 피해가 최소화 하도록 유효시간을 짧게 가져가는게 좋습니다.
하지만 30분짜리 Access Token 은 30분마다 새로 로그인 하여 토큰을 받아야 합니다.
이러한 사용자의 매번 로그인 하는 과정을 생략하기 위해 필요한게 Refresh Token 입니다.
Refresh Token은 Access Token(로그인 토큰) 보다 긴 유효 시간을 가지며, Access Token 이 만료된 사용자가 재발급을 원할 경우 Refresh Token 을 함께 전달합니다.
서버는 Access Token 에 담긴 사용자의 정보를 확인하고 Refresh Token 이 아직 만료되지 않았다면 새로운 토큰을 발급해 주게 되면 사용자가 매번 로그인해야하는 번거로움 없이 로그인을 지속적으로 유지할 수 있습니다.
Refresh Token 저장소
- Refresh Token 은 사용자 정보가 없기 때문에 저장소에 값이 있으면 검증 시 어떤 사용자의 토큰인지 판단하기 용이
- 탈취당했을 때 저장소에서 Refresh Token 정보를 삭제하면 Access Token 만료 후에 재발급이 안되게 강제 로그아웃 처리 가능
- 일반적으로 Redis 많이 사용