It sounds to me like you could do this all in the database if you used a more generic data model. Apache::Session would be fine though, as long as you never have a large amount of data in a single session. If the data gets too big, performance will suffer.