JWT란 무엇인가?
JWT는 JSON Web Token의 약자로, 두 시스템 간에 정보를 안전하게 전송하기 위해 사용되는 토큰 기반 인증 방식입니다. 예를 들어, 클라이언트와 서버 간에 인증 정보나 사용자 상태를 유지하고 싶을 때 JWT를 활용합니다. JWT는 JSON 형태로 데이터를 저장하며, 그 데이터는 서명(약간에 암호화)되어 안전하게 교환됩니다.
JWT의 구조
JWT는 세 부분으로 구성됩니다:
- Header (헤더): 토큰의 타입과 해싱 알고리즘 정보를 담고 있습니다. 보통 'alg' (알고리즘)와 'typ' (타입)이라는 두 가지 속성이 포함되며, 예를 들어, {"alg": "HS256", "typ": "JWT"} 형태입니다.
- Payload (페이로드): 주로 사용자 정보나 데이터(claims)를 포함하는 부분입니다. 여기에는 사용자 ID, 사용자이름, 토큰 만료 시간 등의 정보가 담겨 있습니다.
- Signature (서명): 헤더와 페이로드의 내용을 해싱한 뒤, 비밀키로 서명한 부분입니다. 이 서명을 통해 데이터가 위변조되지 않았음을 확인할 수 있습니다.
JWT의 작동 방식
JWT는 클라이언트가 서버에 인증 요청을 보내면 서버에서 토큰을 발급합니다. 이 발급된 토큰은 클라이언트에 저장되어 있으며, 이후 요청을 보낼 때 이 토큰을 포함합니다. 서버는 토큰을 검증하여 클라이언트가 올바른 사용자임을 확인합니다. 이를 통해 세션을 유지하지 않고도 사용자 인증을 할 수 있어 서버 부하가 줄어들고 확장성이 높아집니다.
JWT의 장점과 단점
- 장점:
- 확장성: 서버에 세션을 저장할 필요가 없으므로 서버 확장에 유리합니다.
- 독립적 인증: 각 요청에 대해 JWT를 포함하므로 상태를 서버에 저장할 필요가 없습니다.
- 자기 포함(Self-contained): JWT 자체에 필요한 정보를 포함하고 있으므로, 서버에서 사용자 정보를 따로 찾을 필요가 없습니다.
- 단점:
- 보안 위험: JWT가 한번 발급되면 만료 전까지는 유효합니다. 따라서 토큰이 탈취당하면 위험할 수 있습니다.
- Payload 노출: JWT는 Base64로 인코딩되므로, 암호화된 것이 아니기 때문에 누구든 Payload 부분을 디코딩할 수 있습니다. 민감한 정보는 포함하면 안 됩니다.
JWT 사용 사례
- API 인증: REST API에서 인증을 위해 많이 사용됩니다. 클라이언트가 매 요청마다 서버에 JWT를 포함해 보내고, 서버는 이를 통해 인증합니다.
- SSO (Single Sign-On): JWT를 통해 여러 시스템 간의 단일 로그인을 구현할 수 있습니다. 사용자가 한 번 로그인하면 다른 시스템에서도 동일하게 인증된 상태가 유지됩니다.
링크 확인
- 서명(Signing): JWT의 서명은 토큰이 변조되지 않았음을 보장하는 과정입니다.
- 암호화(Encryption): 암호화는 데이터를 보호하여 다른 사람이 볼 수 없게 만드는 과정입니다.
결론적으로, 대칭키 방식으로 JWT 서명을 사용하는 것과, 데이터를 암호화하여 보호하는 것은 별개의 개념입니다. 대칭키 방식에서는 서명을 통해 데이터의 무결성을 확인하며, 데이터 보호는 HTTPS나 다른 암호화 기법을 통해 처리해야 합니다.
따라서 HTTP로 통신을 하고 있다면, JWT 자체는 암호화되지 않고 평문으로 전송되기 때문에 HTTPS 사용이 강력히 권장됩니다.
'Spring boot > 개념 공부' 카테고리의 다른 글
JWT 인터셉터 적용 (4) | 2024.11.08 |
---|---|
JwtUtil 만들어 보기 (0) | 2024.11.08 |
RestAPI 컨트롤러 요청과 응답 (1) | 2024.11.08 |
공통 응답 DTO 및 예외 처리 구조 만들기 (0) | 2024.11.08 |
RestAPI 주소 변경 및 인터셉터 수정 (0) | 2024.11.08 |