Generated texture coordinate means that blender literally generates a bounding box around your object. Think of a cube that gets stretched to fully encompass your mesh. However, blender scales this bounding box the same way as it would be if you scaled a cube in object mode - it results in non-uniform scale for the "box" - this is why the sides that have to be stretched to be more "rectangular" or "elongated" cause the texture to stretch as well.
As MikoCG recommended, the best way around this is to use object coordinates.
However, while generated coordinate places the X/Y origin in the "top left" corner, so to speak, you will have to use a mapping node to get your positioning right (often 0.5 or -0.5 on the X and Y location works fine) when using object. Because object doesn't generate a bounding box in the same way as generated, the textures will behave predictably in every direction.
NOTE - these images and description are a crude overview of what's really going on, however, I find it really helps to think this way when picking Texture Coordinates.