Controllers are always reacting to something, so you're correct in thinking that "being reactive" is not the difference between the two. The key is what the controllers are reacting to.
In feedback control, the controller acts to minimize an error signal. A system including feedback control would have:
- A sensor to measure system output
- A reference signal, to which the system output is compared
- A controller which operates on (i.e. "reacts to") the difference between the reference and the measurement
This type of control scheme is also referred to as "closed-loop control."
In feed forward control, the controller acts without any direct knowledge of the system's response. It may be reacting to a reference signal or output from a sensor (as long as the sensor is not measuring system output - this would create a feedback loop) or both. This is also called "open-loop control."
This is more than a semantic difference. Only a closed-loop controller has the ability to compensate for unknown parameters, modelling errors, etc.
In your question, you refer to a situation where feed forward is used as a means to achieve disturbance rejection. The idea would be that you measure the disturbance input, model the response of the system due to the this input, calculate the required control input to counteract this response, and then apply that control input. Since your control signal (controller output) is independent of system response, this is open-loop control.
It is not uncommon for controllers to be designed with both feedback and feed forward components. In this case, I usually think of the feedback component as the primary path, and the feed forward component as supplementary, to improve performance in some way.
For example, in motion control, a motor can be made to follow a velocity reference by using a PID controller that operates on the velocity error. Because the PID controller operates only on the error, without any knowledge of the reference signal, there must be some error before the controller responds, so there will be some amount of delay. You can increase the gains to minimize the delay, but because real systems are flexible, there will be some point at which the system will become unstable as the gains are increased.
You can add a feed forward path, however, which operates on the derivative of the velocity reference (so, the acceleration). If the system's inertia is constant, the feed forward controller can be a simple proportional gain times the acceleration signal, which would correspond to some additional torque.
Now the motor will generate torque in response to changes in the velocity reference without waiting for the system to develop velocity error. Because the feedback controller exists as well, any effects of friction, modelling error (i.e. if the selected feed forward gain is not exactly correct for the system's inertia), etc., the controller can still compensate and drive the error to zero.