I believe <security-role> is used for defining the roles in your web app, and is used by the container to map its roles to those in your DD.
<security-role-ref> on the other hand is where declarative programmatic security has been used.
If request.isUserInRole("Boss") has been used, but your app has no declaration of a 'Boss' role because you have used 'Manager', you can use <security-role-ref> to tell the container that 'Boss' means 'Manager'.
Open to corrections on this one as I'm learning too!
28/06/06 - SCJP - 69%, 05/06/07 - SCWCD - 92%, 28/02/08 - IBM DB2 v9 Fundamentals (Exam 730) - 87%, 18/11/08 - IBM DB2 v9 DBA (Exam 731) - 89%, 26/02/11 - SCBCD - 88%