인증은 클라이언트가 "누구"인지 확인하는 과정이다. 기본적으로 ID와 패스워드, 혹은 사용자의 정보를 이용해 인증을 거친다.
인가는 그 "누가" 접근하고자 하는 작업의 리소스 혹은 서비스를 제공해도 되는지를 판단한다.
우리는 대한민국에서 주민등록증을 발급받았다. 만 19세가 지나 주점에서 주류를 구매하기 위해서 주점에 신분증을 제시하고 신원을 확인한다.
주민등록증을 발급받아 우리의 신분을 인증 받았고, 주점에서 신분증을 확인해 주류를 구매하는 권한을 인가받은 것이다.
웹에서는 사용자가 접근하기 위해서 API요청을 하면 서버에서 응답을 내리기 이전 사용자의 인증 정보를 바탕으로 사용자 인증을 진행한다.
등록된 인증정보인지 확인된다면 권한을 응답받아 API권한을 인가받는다.
웹 애플리케이션에서 사용자 정보를 저장하는 기술
Request - Response 방식으로 진행되며 HTTP 프로토콜은 Stateless 특성을 가져 상태정보를 유지할 수 없다.
사용자의 세션은 웹 애플리케이션에 접속한 후 일정시간(웹 브라우저 혹은 커넥션이 유지되는)동안 정보가 유지된다.
서버에 세션이 관리된다는 것은 서버에 저장되는 리소스가 존재한다는 것이다.
그렇다는 것은 보안에 좋지만, 사용자가 많은 웹 브라우저는 부하가 걸릴 수 있다는 뜻이다.
클라이언트의 브라우저에 쿠키를 저장한다.
로그인 정보 혹은 기타 데이터 혹은 설정 등을 쿠키에 저장해 활용할 수 있다.
로그인 과정에서 서버는 쿠키를 이용해 클라이언트의 인증 정보를 유지한다. 유효기간이 존재하고 유효기간이 지나면 쿠키는 삭제된다.
key - value 로 이루어져 있고, 이름, 값, 유효기간, 도메인, 경로 등의 정보를 포함한다.
값을 클라이언트가 가지고 있다는 뜻은 보안에 민감하다는 것이다. 쿠키에 민감한 정보를 포함하는 경우 보안 프로토콜을 통해 암호화해야한다.
말 그대로 Header에 정보를 저장한다. HTTP basic auth나, HTTP basic Digest, OAuth 등의 프로토콜을 통해 이루어진다.
그 중 basic같은 경우 요청 -> 인증요구 -> 인증 -> 성공의 단계로 진행되고 각 레이어에 해당하는 header가 존재한다.
서버가 인증을 요구함에 따라 클라이언트는 header에 id/pw가 적힌 authorization을 적어 보낸다.
이는 base64라는 인코딩 방식으로 암호화되지만, 복호화가 가능한 평문으로 안전하지 않다.
때문에 Https/TLS와 basic 인증은 함께 사용되어야 안전하다.