들어가기 전
JWT 토큰이 무엇인가? 라는 질문을 받았을 때 제대로 답변을 할 수 없어서 JWT에 대해 더 자세히 공부하기 위해 글을 작성한다.
요약
- JWT는 서버와 클라리언트 간 정보를 주고받을 때 HTTP request header에 JSON 토큰을 넣은 후 서버는 별도의 인증 과정 없이 헤더에 포함된 JWT 정보를 통해 인증한다.
- 서버가 가지고 있는 개인 키를 가지고 Signature를 복호화한 다음 base64urlEncode(header)가 JWT의 header 값과 일치한 지, base63urlEncode(payload)와 일치하는지 확인하여 일치하면 인증을 허용한다.
본문
1. JWT 토큰이란?
JWT(JSON Web Token)은 JSON 객체에 인증에 필요한 정보들을 담은 후 비밀키로 서명한 토큰으로, 인터넷 표준 인증 방식이다. 공식적으로 인증(Authentication) & 권한 허가(Authorization) 방식으로 사용된다.
JWT는 전자서명된 URL-safe의 JSON이다. HMAC 알고리즘을 사용하여 비밀키 또는 RSA를 이용한 Public Key/Private Key 쌍으로 서명할 수 있다.
2. JWT 프로세스
- JWT를 발급받기까지의 로그인 전 과정1) 사용자가 서버에 로그인(ID/PW) 요청을 보낸다.
2) 서버는 비밀키를 사용해 JSON 객체를 암호화한 JWT 토큰을 발급한다.3) JWT를 header에 담아 클라이언트에 보낸다. - 로그인 이후의 과정1) 클라이언트는 JWT를 로컬에 저장한다.2) API를 호출할 때마다 request header에 JWT를 실어 보낸다.3) 서버는 header를 매번 확인하여 사용자가 신뢰할 만한지 체크하고, 인증이 되면 API에 대한 응답을 보낸다.
그런데 왜 매번 JWT를 header에 넣어서 보내야 할까? 이유는 다음 2가지의 HTTP가 가지는 특성 때문이다.
- connectionless: 한 번 통신이 이뤄지고 난 후에 연결이 바로 끊어짐
- stateless: 이전 상태를 유지/기억하지 않음
즉, 화면을 이동하게 되면 새로운 API를 요청하게 되고 다시 신뢰할 만한 사용자인지 인증하는 과정을 거쳐야 하는데 매번 사용자가 인증하는 과정을 거치는 것도 귀찮고 통신이 느려지는 문제가 생길 수 있기 때문에 인증된 사용자가 어느 정도 기간 동안 재인증하지 않아도 되도록 만든 것이 Access Token이다.
3. JWT 구조
JWT는 Header, Payload, Signature 3개로 구성되어 있다.
- Header
- alg: Signature에서 사용하는 알고리즘
- typ: 토큰 타입
- Payload(민감한 정보를 담지 않아야 함)
- sub : 토큰 제목(subject)
- aud : 토큰 대상자(audience)
- iat : 토큰이 발급된 시각 (issued at)
- exp : 토큰의 만료 시각 (expired)
- Signature
- Header와 Payload의 문자열을 합친 후, Header에서 선언한 알고리즘과 Key를 이용해 암호화한 값이다.
Header와 Payload는 단순히 Base64url로 인코딩되어 있어 누구나 쉽게 복호화 가능할 수 있지만, Signature는 Key가 없으면 복호화할 수 없기 때문에, 보안상 안전하다는 특성을 가질 수 있다. header에서 선언한 알고리즘에 따라 key는 개인 키가 될 수도 있고 비밀키가 될 수도 있다. 개인 키로 서명했다면 공개키로 유효성 검사를 할 수 있고, 비밀키로 서명했다면 비밀키를 가지고 있는 사람만이 암호화 복호화, 유효성 검사를 할 수 있다.
주의: 토큰은 발급되면 만료 기간 변경이 불가능하므로 토큰 만료 처리를 구현해야 한다
4. JWT 토큰 디코딩 사이트
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
마무리
많은 사람들이 이 글을 통해 JWT 토큰을 이해했으면 좋겠다.
'Knowledge' 카테고리의 다른 글
[Knowledge] RSA 암호화 알고리즘 (0) | 2024.08.21 |
---|---|
[Knowledge] AES 암호화 알고리즘 (0) | 2024.08.14 |
[Knowledge] 유출, 누출, 노출 차이 (0) | 2024.08.12 |
[Knowledge] SSL/TLS 프로토콜과 Cipher Suite의 이해 (0) | 2024.07.22 |
[Knowledge] 화면 캡처 및 편집 프로그램 픽픽(PickPick) (0) | 2024.03.22 |