When should I use RemoteEvents, and what's some tactic's to prevent exploiters from toying with them?

Sanity checks, literally just sanity checks. You could also have a key system, but that won’t be much help as it will easily be cracked within an hour or two by exploiters.
As for what sanity checks are, they are simply checks to make sure everything is actually possible and should happen.

What’s that?

Could you give me an example of the two?

It’s basically like a translation for a random set of letters/numbers. Ex:

function translate(key)
	local ktable = string.split(key, "")

	local actualkey = ""
	
	local num1 = math.floor(#ktable/4) + 1
	local let1 = ktable[num1]
	actualkey ..= let1

	num1 = math.floor((#ktable/4)) - 1
	let1 = ktable[num1]
	actualkey ..= let1

	num1 = #ktable - 2
	let1 = ktable[num1]
	actualkey ..= let1

	num1 = math.floor((#ktable + 2)/2) + 1
	let1 = ktable[num1]
	actualkey ..= let1
	
	return actualkey
end