I should point out that, depending on your needs, you may not actually need to do anything to tag contacts who have filled out a form. You can create segments and shared filters based on the condition that contacts have filled out any form or filled out a specific form. So you can always identify these contacts later by creating a segment.
It is when you want additional information recorded that you need to take additional steps to store the data - for example, the campaign ID field you mention tells you not only that the contact filled out the form, but also which campaign they were in when they filled it out (forms can be used in multiple campaigns). The query string method Michael McKinnon mentioned is used to capture additional information such as referring source or campaign ID. You can also write specific values to particular contact fields in a form processing step using the "Update Contacts - With Custom Values" form processing step - that's a good way to capture things like lead source and campaign ID if the form is only used for one lead source and/or campaign. If you have a lot of additional information you need to capture along with the form submit, you can use the "Update Custom Data Object" processing steps to store that data in a custom data object associated with the contact. That's overkill for most use cases, though.