오늘 면접에서 JWT관련해서 질문을 받았는데 어디에 사용되는지 라던가 하는 부분은 알아도 정확하게 어떻게 구성되고 어떤식으로 작동하는지에 대한 답변이 부족했다고 생각이 들어서 JWT에 대해서 정리해보려고 한다.
일단 첫번째 포스팅에서는 JWT 자체에 대해서 알아보고 다음 포스팅에서 직접 사용하는 방법을 정리하면 좋을 것 같다.
JWT?
- JSON Web Token의 두문자어로서 JSON 포맷을 통해서 데이터를 저장하는 웹 토큰이다.
- JWT는 사용자 인증의 과정에서 보편적으로 사용되는 토큰이다.
- 토큰 자체에 정보가 저장되는 Self-Contained 라는 특성을 가진다.
JWT의 구성
- JWT는 Header, Payload, Signature의 총 3가지 부분으로 구성된다. 최종적으로 생성된 토큰에서는 '.'를 기준으로 분리된다.
- 각 부분은 Base64로 인코딩된다.
- Header
- typ와 alg의 두가지 데이터로 구성된다.
- typ 키를 통해서 토큰의 타입을 지정한다.
- alg 키를 통해서 이후 Signature 파트의 데이터 생성 및 토큰 검증에 사용할 알고리즘을 지정한다.
- 암호화가 진행되지 않는 부분
- Payload
- 토큰을 통해서 사용할 데이터들의 조각인 Claim으로 구성된다.
- Claim의 경우 총 3가지로 나뉜다.
- Registered Claim(등록된 클레임)
- 미리 정해져있는 키로 구성된 데이터들로 각 키에 해당하는 데이터는 선택적으로 사용할 수 있다.
- iss(토큰 발급자), sub(토큰 제목), aud(토큰 대상), exp(토큰 만료시간), nbf(토큰 활성화 시간), iat(토큰 발급시간), jti(토큰 고유 식별자)
- Public Claim(공개 클레임)
- 사용자 정의 클레임으로 충돌 방지를 위해서 URI 포맷을 사용한다.
- Private Claim(비공개 클레임)
- 클라이언트, 서버 간 합의하에 사용되는 클레임을 지칭한다.
- 공개 클레임과는 다르게 일반적인 Key:Value 구조를 사용하므로 충돌 가능성이 존재하여 사용에 유의해야 함
- Registered Claim(등록된 클레임)
- 사용자 인증에 사용되는 토큰의 경우 사용자 특정을 위한 실질적인 정보로 구성된다.
- Header와 같이 암호화가 진행되지 않는다.
- Signature
- Signature 즉, 서명 파트는 토큰을 인코딩하거나 유효성 검증에 사용되는 고유한 암호화 코드를 담고있다.
- Signature 코드 생성 절차
- Header 와 Payload의 데이터를 Base64로 인코딩한다.
- 1의 결과로 생성된 데이터와 비밀키를 사용하여 Header의 alg키에서 지정한 알고리즘을 통해서 해싱을 진행한다.
- 2의 결과로 생성된 데이터를 Base64로 인코딩하면 Signature 파트의 데이터 생성이 완료된다.
장단점
- 장점
- Self-Contained 의 특성에 따라서 별도의 인증 저장소를 필요로 하지 않는다.
- MSA 환경에서 중앙 집중식 인증 서버와 DB에 의존하지 않는 인증 및 인가 방법을 제공한다.
- 유효성 검사 과정에서 IO 또는 네트워크 액세스를 필요로 하지 않고, 최신 웹 서버 HW에서 확장이 용이하다.
- 기타 사용을 권장하는 요소들
- URL 파라미터와 헤더로 사용
- 수평 스케일이 용이
- 디버깅 및 관리가 용이
- 트래픽 대한 부담이 낮음
- REST 서비스로 제공 가능
- 내장된 만료
- 독립적인 JWT
- 단점
- 토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없습니다.
- 더 많은 필드가 추가되면 토큰이 커질 수 있습니다.
- 비상태 애플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 데이터 트래픽 크기에 영향을 미칠 수 있습니다.
- 중요한 부분인 Payload 파트가 암호화되지 않기 때문에 추가적인 암호화 방안을 고려하거나, Payload에 중요한 데이터를 넣지 않고 운영해야 한다.
- 토큰 자체에서 상태를 관리하지 않기때문에 등록된 클레임에 해당하는 데이터 중 만료와 관련된 데이터를 필수로 사용해야 한다.
참고
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
'프로그래밍 > 기타' 카테고리의 다른 글
CORS - 1 (0) | 2022.02.18 |
---|---|
자주 쓰는 psql 명령어 정리 (0) | 2021.10.08 |
Google의 Cloud Functions에 입문해보자 (0) | 2021.04.01 |