The secret to good french onion soup is in the onions. You need a lot of them cooked over a long period of time (read slowly). You don't want the exterior part of the onion to brown in hot fat, but the natural sugars in the onion to reach the point of caramelization.
The fat can be many things depending on taste. I prefer pork fat, either rendered from trimmings or from bacon (if you like a more smoky taste to the soup - I don't). Some people use butter.
Traditionally, chicken stock is actually used, as it doesn't overpower the natural flavors of the caramelized onions (read up on Dumas Peré for more history). This is more the better if you don't make your own stocks/glace de viande, as the only commercial "stock" I find edible is Swanson Low-Sodium Chicken Broth (I make my own beef and pork stock).
The cheese is often heavily debated, but I go with real Gruyere. It has a bit of saltiness like an aged mozzarella, but a nuttiness and melting characteristic of a good swiss (as it is one) - note: no stringy strands of cheese from crock to spoon to mouth. It's the most expensive part of the dish.
For herbs, I prefer not to use thyme or bay going sans-herbs, but that is a personal preference. It's all about the onions and cheese for me.
Lastly you need a splash of a vinegar to balance flavors. Go with Balsamic if you like sweet, I prefer Sherry Wine Vinegar.
So here is my favorite recipe. Its based on Thomas Keller's proportions with my own preferences and an ode to history.
8 pounds Yellow Onions (Yes, 8 pounds)
Rendered Pork Fat
2.5 Quarts Chicken Stock
Kosher Salt & Freshly Ground Black Pepper
1-2 Tablespoons Sherry Wine Vinegar
Baguette - Cut into 1-inch Cubes
Gruyere Cheese - Thin slices & Large Shreds
Evenly slice the onions thinly. Add about 1/3-C of the pork fat to the pot along with the onions and a couple teaspoons or so of Kosher Salt over medium-low to medium heat, stirring every 15 minutes or so. If you hear them "frying", reduce the heat. This takes about 4 hours. Eventually you will get a very-rich and dark-brown pile of loveliness.
Add the stock, and simmer/reduce over medium heat until you have 2.5 quarts of soup (this can easily be done with some prep work. Before cooking, add 2.5 quarts of water to your pot of intended use and make a dip-stick with a wooden spoon by marking the pot level on it's handle with a knife). Add your vinegar, and then season to taste with salt and pepper. You can now store this in the fridge, or proceed.
Adjust one oven-rack to the middle, and another close to the broiler. Heat the oven to 375ºF and toast the bread cubes until they are mostly hard and dried out. Remove them and crank the oven as high as it will go (550ºF or so). On a sheet pan (to catch crock-overflow - think thermodynamics here) fill your crocks with the hot soup to within a 1/2-inch of the top, add a few bread cubes, place a large/thin slice of cheese down first making sure to overlap the edges of the crock, then a handful of the grated cheese. Switch the oven to broil, and wait a minute for it to heat up. Broil your crocks until the cheese forms a brown crust and melts down the sides of the crock - small black splotches are okay.
Allow the napalm to cool a bit. Eat.
I like this soup with a small salad, and a traditional french dessert like Chocolate Mousse or Creme Caramel with coffee.
EDIT: There is enough for six 1.5 Cup servings.