최근 웹 서비스는 페이지를 열면 먼저 로그인이 필요한 경우가 많아졌다. 일부는 볼 수 있으나 서비스가 제한된 경우가 많다. 이런 사이트에는 유저명과 패스워드를 넣고 로그인을 하여 서비스 하는 쪽에서 누가 접속했는지 파악한다. 인증된 사용자에게 특별한 정보들을 보여줄 수도 있다. 역사를 돌이켜 보면 인증에는 몇 가지 방식이 있는데 먼저 유저명과 패스워드를 매번 클라이언트에 보내는 방식 두 가지를 소개한다.
가장 간단한 것이 Basic 인증이다. 이 인증은 유저명과 패스워드를 BASE64로 인코딩 한 것이다. BASE64 인코딩은 가역변환이므로 서버로부터 복원해 원래 유저명과 패스워드를 추출 할 수 있다. 추출된 정보를 서버의 데이터 베이스와 비교해서 정상 사용자인지 검증한다. 단 SSL/TLS 통신을 사용하지 않은 상태에서 통신이 감청되면 손쉽게 로그인 정보가 유출된다.
base64(유저명 + ":" + 패스워드)
이보다 강력한 방식이 Digest 인증 방식이다. 이 인증은 해시함수를 이용하는데 만약 해커가 방대한 계산 리소르를 사용한다면 출력이 나오는 몇 가지 후보들을 찾아 낼수야 있겠으나 단ㅅ히간에 무자열을 복원하기는 쉽지 않다. 브라우저가 보호된 영역에 접속하려고 하면 401 Unauthorized라는 스테이스 코드로 응답이 돌아온다. 알고리즘과 랜던 데이터를 조합하고 보호 수준등 설정된 값들로 암호화된 정보가 서버 측에오면 이 헤더에 있는 정보와 서버에 저장된 유저명, 패스워드가 같은지 계산하여 확인 한다. 재발송된 요청과 동일한 결과값이 계산되면 사용자가 정확하게 유저명과 패스워드를 입력했음을 보증할 수 있다. 이로써 유저명과 패스워드 자체를 요청에 포함하지 않고도 서버에서 사용자를 올바르게 인증할 수 있게 된다.
Authorization: Digest username="유저명", realm="영역명", nonce="랜덤 데이터",
uri="/dlksk.html", nc=00000001(전송횟수), cnonce="클라이언트 랜덤 난수",
response="cnonce로 계산한 값"
현재는 위에서 제시된 인증 방식은 잘 쓰지 않는데. 그 이유는 몇 가지를 들 수가 있다.
최근 많이 사용되는 방식은 폼을 이용하여 로그인과 쿠키를 사용하는 세션 관리 조합이다. 이 방식으로는 처음에 설명한 폼과 쿠키를 이용하는 단순한 구조이다. 클라이언트는 폼으로 id와 비밀번호를 전송하는데, Digest 인증과는 달리, 유저 id와 패스워드를 직접 송신하므로 SSL/TLS가 필수이다. 서버측에서는 유저 id와 패스워드로 인증하고 문제가 없으면 세션 토큰을 발행한다. 서버는 세션 토큰을 관계형 데이터베이스나 키 벨류형 데이터베이스에 저장해둔다. 토큰은 쿠키로 클라이언트에게 전달되고 두 번째 이후 접속부터는 쿠키를 재사용하여 로그인된 클라이언트임을 서버가 알 수 있다. 웹 서비스에 따라서는 사이트 간 요청 위조 (CSRF) 대책으로 랜덤 키를 보내는 경우도 있다.