Strictly speaking a User exit is any place within standard SAP, where SAP have added a mechanism for client specific code to be executed.
Customer exits are maintained with transaction CMOD. They are constructed in such a way that all development is in the customer name range, so no access keys are required.
Most other types of exits require an access key, as they are places where you can put your own code directly into standard SAP.
For example, in Sales Order Processing, SAPMV45A, a number of user exits can be found in include MV45AFZZ. To modify this, however, you would need an access key from SAP for this include. If you wanted to utilize the screen exits available in Sales Order Processing, you would need an access key for SAPMV45A.
VOFM transaction manages many user exits. When a VOFM exit is created, two access keys are required. One for the include in which the code will be, and one of the function group in which it sits.
User exits and customer exits are the same thing.
Both are used to give the customer the chance to influence the outcome of a process(-step) in some way, without having to change the standard SAP software. For example: if an order is entered in the system, availability checks, credit checks etc. could be performed by the system but just before writing the order to the database, the program runs a user exit. In this user exit, your code could change some fields in the order or write an entry in a table that you created for some reason.