( 이것은 실제로 NodeJS 등에 국한되지 않고 자체 문제이기 때문에이 스레드 에서 생성되었습니다 )
인증을 사용하여 REST API 서버를 구현하고 있으며 사용자가 사용자 이름 / 암호를 사용하여 / login 끝점을 통해 로그인 할 수 있도록 JWT 토큰 처리를 성공적으로 구현했습니다. 그러면 서버 암호에서 JWT 토큰이 생성되어 서버로 반환됩니다. 고객. 그런 다음 토큰은 인증 된 각 API 요청에서 클라이언트에서 서버로 전달되며, 서버 암호는 토큰을 확인하는 데 사용됩니다.
그러나 진정으로 안전한 시스템을 만들기 위해 토큰의 유효성을 검사하는 방법과 정도에 대한 모범 사례를 이해하려고합니다. 토큰을 "검증"하려면 정확히 무엇을해야합니까? 서버 시크릿을 사용하여 서명을 확인할 수있는 것으로 충분합니까? 아니면 서버에 저장된 일부 데이터와 토큰 및 / 또는 토큰 페이로드를 교차 확인해야합니까?
토큰 기반 인증 시스템은 사용자의 암호를 얻는 것보다 토큰을 얻는 것이 동일하거나 더 어려운 경우 각 요청에서 사용자 이름 / 암호를 전달하는 것만 큼 안전합니다. 그러나 내가 본 예에서 토큰을 생성하는 데 필요한 유일한 정보는 사용자 이름과 서버 측 비밀입니다. 이것은 악의적 인 사용자가 서버 비밀에 대한 지식을 1 분 동안 얻는다고 가정하면 이제 모든 사용자 를 대신하여 토큰을 생성 할 수 있으므로 특정 사용자에게만 액세스 할 수있는 것은 아닙니다. 획득했지만 실제로 모든 사용자 계정에 적용됩니까?
이것은 저에게 질문을 던집니다.
1) JWT 토큰 유효성 검사는 토큰 자체의 서명을 확인하는 것으로 제한되어야합니까? 서버 비밀의 무결성에만 의존하거나 별도의 유효성 검사 메커니즘을 동반해야합니까?
어떤 경우에는 / login 끝점을 통해 성공적으로 로그인하면 세션이 설정되는 토큰과 서버 세션을 함께 사용하는 것을 보았습니다. API 요청은 토큰의 유효성을 검사하고 토큰에있는 디코딩 된 데이터를 세션에 저장된 일부 데이터와 비교합니다. 그러나 세션을 사용한다는 것은 쿠키를 사용하는 것을 의미하며 어떤 의미에서는 토큰 기반 접근 방식을 사용하는 목적을 무효화합니다. 또한 특정 클라이언트에 문제를 일으킬 수 있습니다.
공격자가 "유효한"토큰을 생성 할 수 있도록 서버 비밀이 손상 되더라도 / login 엔드 포인트를 통해 생성 된 정확한 토큰 만 보장하기 위해 서버가 현재 사용중인 모든 토큰을 Memcache 등에서 유지하는 것을 상상할 수 있습니다. 받아 들여질 것입니다. 이것이 합리적입니까, 아니면 중복 / 과잉입니까?
2) JWT 서명 검증이 토큰을 검증하는 유일한 수단 인 경우 서버 비밀의 무결성이 중단 점임을 의미합니다. 서버 비밀은 어떻게 관리해야합니까? 환경 변수에서 읽고 배포 된 스택 당 한 번 생성 (무작위 화?) 하시겠습니까? 주기적으로 갱신 또는 순환 (그렇다면 순환 전에 생성되었지만 순환 후에 유효성을 검사해야하는 기존 유효한 토큰을 처리하는 방법, 서버가 주어진 시간에 현재 및 이전 비밀을 유지하는 경우 충분할 수 있음) ? 다른 것?
아마도 나는 서버 비밀이 손상 될 위험에 관해서 지나치게 편집증적일 수 있습니다. 물론 모든 암호화 상황에서 해결해야하는보다 일반적인 문제입니다 ...
RSAPrivateKey privateKey
??