참고 블로그 https://gksdudrb922.tistory.com/217
Spring Security에 jwt를 접목하여 프로젝트에 적용해보았습니다.
JWT(Json Web Token)란?
JWT는 정보를 JSON 형식으로 표현하며, 디지털 서명 또는 메시지 인증 코드를 사용하여 정보의 무결성을 보장합니다. 주로 사용자 인증 및 권한 부여를 관리하는데 사용됩니다.
JWT를 사용하는 이유
HTTP는 기본적으로 무상태성(state-less)를 지향합니다. 무상태성이란 서버가 클라이언트의 정보를 갖고있지 않은 것ㅇ르 말합니다. 세션 기반 인증 방식은 사용자의 로그인 정보를 서버 측에서 관리하기 때문에 로그인 시도 횟수가 증가하면 서버에 부하가 발생할 수 있습니다.
JWT 토큰을 사용하면 사용자의 로그인 정보가 클라이언트 측에 저장되기 때문에 서버가 여러대이거나 서버를 변경할 때 사용자의 상태를 서버가 저장할 필요가 없습니다. 사용자가 누구인지 기억하지 않고 토큰의 정보를 보고 접근 권한을 확인하면 됩니다.
JWT 토큰의 장점과 단점
장점
단점
1. 토큰이 유출되면 보안 문제가 발생할 수 있습니다.
2. 네트워크 대역폭 및 저장 공간을 소비할 수 있습니다.
하지만 토큰이 탈취되면 사용자 정보를 그대로 제공하는 꼴이 되기 때문에 민감한 정보는 토큰에 포함하지 말아야 한다. Access Token과 Refresh Token 두 가지의 토큰으로 나누어 Access Token의 유효 기간을 짧게 가져가고 만료되면 Refresh Token을 통해 Access Token을 새로 발급하는 방식으로 안전성을 높인다.(하지만 완벽하지 않다)
- 헤더 (Header): JWT의 헤더는 JWT의 유형 (typ)과 사용하는 암호화 알고리즘 (alg)을 포함합니다. 이 정보는 JWT를 검증하기 위한 필수 정보입니다.
- 페이로드 (Payload): 페이로드는 실제로 전달하려는 정보를 포함하며, 클레임 (Claim)이라고도 불립니다. JWT에는 세 가지 종류의 클레임이 포함될 수 있습니다.
- Registered Claims: 표준 클레임으로, 예를 들어 "iss" (발급자), "sub" (주체), "exp" (만료 시간) 등이 있습니다.
- Public Claims: 사용자 정의 클레임으로, 공개적으로 사용 가능하지만 충돌을 방지하기 위해 이름이 URI 형식이어야 합니다.
- Private Claims: 서로 합의된 클레임으로, 정보를 공유하는 양측 간에만 의미가 있습니다.
- 서명 (Signature): 서명은 헤더, 페이로드 및 비밀 키를 사용하여 생성되며, JWT의 무결성을 보장합니다. 서명을 통해 JWT가 변조되지 않았음을 검증할 수 있습니다.
JWT는 클라이언트와 서버 간의 통신에서 사용자 인증 및 권한 부여를 단순화하는 데 사용됩니다. 클라이언트가 로그인하면 서버는 JWT를 생성하고 클라이언트에게 반환합니다. 클라이언트는 이 JWT를 이후의 요청에서 포함시켜 서버에 자신의 신원을 증명하고 권한을 부여받을 수 있습니다. 이렇게 JWT를 사용하면 세션 관리와 서버 상태의 저장이 필요 없어지며, 분산 시스템에서도 사용하기 용이합니다.
그러나 JWT를 사용할 때에는 보안을 신중하게 고려해야 합니다. JWT를 안전하게 사용하기 위해서는 비밀 키를 보호하고, 유효 기간을 관리하며, 중요한 클레임 정보를 서버에서 다시 확인하는 등의 조치가 필요합니다.
'프로젝트 > JAM' 카테고리의 다른 글
---- (0) | 2024.02.05 |
---|---|
-- (0) | 2023.12.04 |
[Spring] Spring Security (0) | 2023.09.02 |
[Spring] 네이버 소셜 로그인 구현 REST API (0) | 2023.08.24 |
[Spring] 카카오 소셜 로그인 구현 REST API (0) | 2023.08.21 |