Remember always, as a principle, that we (as dev) should try to prevent user errors as much as possible. You are talking about a form that is filled in 3 steps. If you are worried about usability, you should consider the following:
- Users should know where they are at all times, meaning that it should be very clear to them that they are in step 1, 2, or 3.
- They should not be allowed to advance if they don't input the minimum required information. Meaning that anything that would let them continue (like buttons, or links) should be disabled until all validations are passed.
- All required fields should be marked as such upon the loading of the form. They should remain marked until validations are passed.
- If the user clicks the back button, validations should be passed again. An implementation trick here is to save the state after every step, storing also the status (valid/invalid), the current step, etc. That way the submit button at the end would be only an indicator of finish, or agreement.
Now, in terms of navigation, you should allow your user to go back to any prior step, but they should not be able to go forward. So if you have A -> B -> C, and the user goes back to A while being in C, that is fine. Validations should be passed again. What cannot happen is that the user then tries to go back to C, especially if validations are tied between steps.
And this is all regardless of implementation. Having usability issues, especially in a long task, would put unnecessary stress on the user. That could be fine if you are dealing with an internal system (the users are tied to the system and its tasks), but if this is for clients (like something that happens after your potential customer lands on a page), it can be lethal for business.
Always keep in mind Nielsen's heuristics: https://www.nngroup.com/articles/ten-usability-heuristics/