개요
난 프로젝트에서 사용자의 인증・인가 기능에 대부분 JWT를 사용했다.
그 이유는 JWT의 간편함에 있다. 서버 입장에선 사용자의 정보를 따로 보관할 필요 없고(Refresh Token 예외), 토큰 내부엔 만료 일자와 사용자의 정보가 모두 포함되어 있기 때문이다.
하지만 JWT의 보안적인 단점도 존재하는데, 이 단점을 극복할 수 있는 기술이 JWE이다. (실제 현업에서 JWE가 사용되는 경우는 드뭄)
이처럼 인증・인가에 사용할 수 있는 토큰이 다양하다. 오늘은 그러한 토큰들에 대해 정리해 보자.
JWT 단점
JWE는 JWT의 암호화 기능을 추가한 기술이다. 이와 같이 따로 암호화된 토큰 기술이 있는 이유는 JWT에 암호화 기능은 없기 때문이다.
보통 JWT 토큰은 아래와 같은 문자열처럼 생겼다.
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0QG5hdmVyLmNvbSIsImlhdCI6MTczNDY5MDI4NSwiZXhwIjoxNzM0NjkwODg1fQ.-jRy3qzp5Xr2SBXevJtnt-S-dMj3RfQJK3P8cSQwsn0
당연히 이 문자열을 보고 어떤 사용자 정보를 담고 있는지, 만료 일자는 언제인지 알기 힘들다.
하지만 저 토큰이 단순히 BASE64로 인코딩 되어서 못 알아보는 거지 암호화된 것은 아니다.
저 토큰 내부에 있는 정보를 알고 싶으면 jwt.io 사이트에 접속해 토큰을 입력하면 사용자 정보, 생성 일자, 만료 일자 등을 모두 볼 수 있다.
- sub(주제 정보) : 사용자 이메일
- iat(발행 시간) : 토큰 생성일자
- exp(유통 기한) : 토큰 만료일자
이러한 이유 때문에 JWT 토큰의 페이로드에 사용자를 식별할 수 있는 중요한 정보를 넣기 힘들다.
JWS, JWE
JWT는 JWE와 JWS의 인터페이스 같은 개념이다. 그리고 JWE와 JWS은 JWT를 구현한 구현체이다.
JWS는 데이터를 서명하여 무결성을 보장하는 기술이며, JWE는 데이터를 암호화하여 기밀성을 보장하는 기술이다.
참고로 우리가 평소에 사용하는 JWT는 JWS이다.
그리고 많은 사람들이 JWE가 JWT의 암호화와 관련된 문제점을 극복하기 위해 나온 기술이라고 생각하는데, 그건 잘못된 정보이다. 그냥 JWT를 구현한 구현체일 뿐이다. (하지만 암호 기능을 곁들인..)
JWE (JSON Web Encryption)
JWE는 총 5개의 요소로 이루어져 있다.
HEADER.ENCRYPTED_KEY.IV.CIPHERTEXT.AUTH_TAG
- Header (헤더)
- 암호화 알고리즘 정보
- 예: RSA, AES 등
- Encrypted Key (암호화된 키)
- 데이터 암호화를 위해 생성된 대칭키(데이터 키)를 공개키 암호화 방식으로 암호화한 값
- IV (Initialization Vector)
- 암호화 시 사용되는 초기화 값
- Ciphertext (암호문)
- 암호화된 데이터(페이로드)
- 주로 사용자 인증・인가를 위한 정보가 담김
- Authentication Tag
- 데이터 변조 여부를 확인하기 위한 태그
JWE의 가장 큰 특징은 암호화이다. 암호화엔 대칭키, 비대칭키 방식을 사용한다.
결국 데이터를 암호화, 암호화된 데이터를 복호화가 하는 작업이 필수인 것이다.
클라이언트는 적절한 키와 알고리즘을 사용하여 JWE를 복호화할 수 있어야 합니다. 미리 통신된 키 또는 키 합의 프로토콜을 통해 파생된 키를 사용하여 JWE를 복호화할 수 있습니다.
위의 문장은 auth-wiki에서 가져온 것이다.
이 과정을 자세하게 풀어보자면 아래와 같다.
- 평문 데이터를 대칭키로 암호화한 후, 대칭키를 비대칭키로 다시 암호화한다.
- 이렇게 두 번 암호화된 데이터를 JWE 토큰으로 발송한다.
- 받을 때에는 두 번의 복호화를 통해 원본 데이터를 복원한다.
현업에서 JWE를 많이 사용하지 않는 이유
위에서 언급했듯이, JWE는 별도의 암호화・복호화를 위한 별도의 처리가 필요하다.
이 과정에 자연스럽게 리소스가 사용되고 지연 시간이 발생한다.
이러한 점이 JWE를 사용하지 않는 가장 큰 이유이다.
또한 현업에선 JWT(JWS)를 많이 사용하는데, 그렇다면 이 방식은 보안에 위험한 방식인가??
그럴 수 있다.
하지만 이러한 문제를 극복하기 위한 방법이 JWE 말고 다른 방법이 존재한다.
바로 HTTPS이다.
HTTPS는 이전 일기에서 정리했듯이, 보안 계층을 추가해 데이터를 암호화한 통신 방식이다. (대부분의 현업에선 HTTPS 통신을 사용)
이 과정에서 자연스럽게 토큰이 암호화되는 것이다.
참고
'개발 일기' 카테고리의 다른 글
[개발 일기] 2025.01.21 - TCP/IP (0) | 2025.01.21 |
---|---|
[개발 일기] 2025.01.20 - 함수형 인터페이스 (0) | 2025.01.20 |
[개발 일기] 2025.01.18 - Collectors (1) | 2025.01.18 |
[개발 일기] 2025.01.17 - SSL (1) | 2025.01.17 |
[개발 일기] 2025.01.16 - B+Tree (0) | 2025.01.16 |