How to implement StackMiddleware for a redirection correctly?
I recently implemented this myself and had to do a fair bit of research and experimenting to get it to work. I too had many of the same questions you have so I've tried to answer them from what I've discovered.

Do I need both an EventSubcriber and StackMiddleware to accomplish this redirection and intercepting of page caching?

You will only need the &quot;StackMiddleware&quot; to intercept the page caching. It should replace &quot;EventSubcriber&quot; if that already exists.

Do I have to create a separate custom module to implement my StackMiddleware class?

This can be achieved in the same module.

How do I use my redirection code (which I know works) with this StackMiddleware class so I can intercept the page cache

The redirection function should be a called like so...

public function handle(...) {
  ...
  $this-&gt;checkForRedirection();
  ...
}

Have it run on every page(so it always checks to see if user is authenticated)?

In my case the user object wasn't available because the middleware runs prior to any user data being set. What I did have was the Drupal session cookie which I could check against. This cookie is set and unset depending if the user is authenticated or not. This may not be the most robust solution so others are welcome.

--
I found this article which was great for getting some of the foundations working:
https://chromatichq.com/blog/replacing-hookboot-and-hookinit-functionality-drupal-8