Una arquitectura de tres niveles no significa necesariamente que todos los niveles estén en servidores o procesos diferentes. Es más una cosa que abstraiga las partes de su aplicación que les permite interactuar solo con interfaces claramente definidas. En su caso, significa mantener la lógica de almacenamiento (base de datos) separada de la lógica de negocios (aplicación) y de mostrar de los resultados (HTML, CSS, ...). Esta separación es principalmente una separación lógica que permite una separación física más fácil si la necesita. La separación se puede hacer dentro de procesos (es decir, diferentes objetos para los niveles), o incluso diferentes sistemas.
La separación entre estas partes no se realiza principalmente debido a la seguridad, sino para que pueda comprender y administrar la aplicación más fácilmente. Hace posible realizar cambios en una capa sin muchos cambios en la otra capa, es decir, podría escalar la base de datos o incluso cambiar la base de datos subyacente sin mucho impacto en la capa de aplicación. O podría tener diferentes UI (web, aplicación móvil ...) idealmente sin cambiar la capa de aplicación y la base de datos.
Por supuesto, este tipo de separación también puede ser útil para la seguridad. Las interfaces claramente definidas entre los niveles facilitan la auditoría de la aplicación. También podría detectar y disuadir mejor los posibles ataques si realmente sabe cómo deben interactuar las partes entre sí. En resumen, la aplicación se puede hacer más robusta con menos esfuerzo, lo que ayuda a escalar, pero también ayuda en seguridad.
Y si los diferentes niveles son en realidad procesos separados (que suele ser el caso con al menos un servidor web y una base de datos), podría colocarlos en diferentes ámbitos de seguridad, es decir, diferentes cuentas de usuario, diferentes contenedores, VM o incluso diferentes servidores. Esto ayuda a mantener el sistema más robusto y menos atacable también.