프로그래밍 언어/HTML,CSS,JS

JSON 웹 토큰 무효화

Rateye 2021. 9. 14. 10:29
728x90
반응형
질문 : JSON 웹 토큰 무효화

작업중인 새 node.js 프로젝트의 경우 쿠키 기반 세션 접근 방식에서 전환하는 것을 고려하고 있습니다 (즉, 사용자 브라우저에 사용자 세션을 포함하는 키-값 저장소에 ID를 저장하는 것입니다). JSON 웹 토큰 (jwt)을 사용하는 토큰 기반 세션 접근 방식 (키-값 저장소 없음).

프로젝트는 socket.io를 활용하는 게임입니다-토큰 기반 세션을 갖는 것은 단일 세션 (웹 및 socket.io)에 여러 통신 채널이있는 시나리오에서 유용 할 것입니다.

jwt 접근법을 사용하여 서버에서 토큰 / 세션 무효화를 제공하는 방법은 무엇입니까?

나는 또한 이런 종류의 패러다임으로주의해야 할 일반적인 (또는 흔하지 않은) 함정 / 공격을 이해하고 싶었습니다. 예를 들어이 패러다임이 세션 저장소 / 쿠키 기반 접근 방식과 동일하거나 다른 종류의 공격에 취약한 경우.

그래서, 내가 다음을 가지고 있다고 가정하십시오 ( 이것이것에서 수정 됨 ).

세션 저장소 로그인 :

app.get('/login', function(request, response) {
    var user = {username: request.body.username, password: request.body.password };
    // Validate somehow
    validate(user, function(isValid, profile) {
        // Create session token
        var token= createSessionToken();

        // Add to a key-value database
        KeyValueStore.add({token: {userid: profile.id, expiresInMinutes: 60}});

        // The client should save this session token in a cookie
        response.json({sessionToken: token});
    });
}

토큰 기반 로그인 :

var jwt = require('jsonwebtoken');
app.get('/login', function(request, response) {
    var user = {username: request.body.username, password: request.body.password };
    // Validate somehow
    validate(user, function(isValid, profile) {
        var token = jwt.sign(profile, 'My Super Secret', {expiresInMinutes: 60});
        response.json({token: token});
    });
}

-

세션 저장소 접근 방식에 대한 로그 아웃 (또는 무효화)은 지정된 토큰을 사용하여 KeyValueStore 데이터베이스를 업데이트해야합니다.

토큰 자체에는 일반적으로 키-값 저장소에 존재하는 정보가 포함되므로 토큰 기반 접근 방식에는 이러한 메커니즘이 존재하지 않는 것 같습니다.

답변

저도이 질문을 연구 해 왔으며 아래의 아이디어 중 완전한 해결책은 없지만 다른 사람들이 아이디어를 배제하거나 추가 아이디어를 제공하는 데 도움이 될 수 있습니다.

1) 클라이언트에서 토큰을 제거하기 만하면됩니다.

분명히 이것은 서버 측 보안을 위해 아무것도하지 않지만 토큰을 존재에서 제거하여 공격자를 막습니다 (즉, 로그 아웃하기 전에 토큰을 훔 쳤어 야 함).

2) 토큰 차단 목록 생성

초기 만료 날짜까지 잘못된 토큰을 저장하고 들어오는 요청과 비교할 수 있습니다. 이것은 모든 요청에 대해 데이터베이스를 터치해야하기 때문에 처음부터 완전히 토큰을 기반으로하는 이유를 부정하는 것처럼 보입니다. 하지만 로그 아웃과 만료 시간 사이에있는 토큰 만 저장하면되므로 스토리지 크기는 더 낮을 수 있습니다 (이것은 직감이며 컨텍스트에 따라 다릅니다).

3) 토큰 만료 시간을 짧게 유지하고 자주 회전하십시오.

토큰 만료 시간을 충분히 짧은 간격으로 유지하고 실행중인 클라이언트가 필요한 경우 업데이트를 추적하고 요청하게한다면 1 번은 완전한 로그 아웃 시스템으로 효과적으로 작동합니다. 이 방법의 문제점은 클라이언트 코드를 닫는 사이에 사용자가 로그인 상태를 유지하는 것이 불가능하다는 것입니다 (만료 간격을 만드는 시간에 따라 다름).

비상시 계획

긴급 상황이 발생했거나 사용자 토큰이 손상된 경우 사용자가 로그인 자격 증명으로 기본 사용자 조회 ID를 변경하도록 허용 할 수 있습니다. 연결된 사용자를 더 이상 찾을 수 없으므로 연결된 모든 토큰이 유효하지 않게됩니다.

또한 토큰에 마지막 로그인 날짜를 포함하여 먼 시간 후에 다시 로그인 할 수 있도록하는 것이 좋습니다.

토큰을 사용한 공격과 관련된 유사점 / 차이점에서이 게시물은 https://github.com/dentarg/blog/blob/master/_posts/2014-01-07-angularjs-authentication-with-cookies에 대한 질문을 다룹니다. -vs-token.markdown

출처 : https://stackoverflow.com/questions/21978658/invalidating-json-web-tokens
728x90
반응형