Le richieste GET dovrebbero essere idempotenti, il che significa che non è possibile invalidare il token una volta utilizzato perché eventuali richieste ripetute non daranno la stessa risposta.
Le richieste GET non dovrebbero mai apportare modifiche di stato al sistema, pertanto non dovrebbe essere richiesto di avere una protezione CSRF. Anche il logout non dovrebbe essere una richiesta GET per il metodo che esegue effettivamente il logout (sebbene sia possibile avere un collegamento GET che si sposta su un'altra pagina prima che una richiesta POST esegua l'azione).
Per risolvere il problema idempotent, con una richiesta GET ripetuta e con lo stesso token CSRF fornito, è possibile visualizzare la risposta memorizzata nella cache dalla prima richiesta, senza apportare alcuna modifica di stato. Tuttavia, stai ancora violando lo standard in caso di modifiche dello stato, vedi rfc7231 :
Request methods are considered "safe" if their defined semantics are
essentially read-only
Of the request methods defined by this specification, the GET, HEAD,
OPTIONS, and TRACE methods are defined to be safe.
Come nota a margine, vorrei anche sostenere che i processi ad uso intensivo di risorse dovrebbero essere anche POST (con protezione CSRF) piuttosto che GET, altrimenti un utente malintenzionato potrebbe eseguire un sistema utilizzando un vettore CSRF.
Pertanto, se hai bisogno di CSRF per un metodo, non implementarlo come GET.