인증이란 누군가 또는 시스템이 실제로 그 누구인지 또는 시스템인지를 결정하는 과정
사용자에 정보와 데이터베이스를 비교해서 사용자를 믿을 수 있는지 누구인지를 확인하는 과정이라고 말할 수 있다.
인증의 유형으로는 SFA(단일 요소 인증) -> 2FA(추가적인 인증 추가) -> MFA(3개 이상의 인증)이 있다.
인증의 절차를 회원가입, 로그인 절차로 분류해서 말하자면
회원가입
은 사용자는 서비스의 가입 절차를 진행하여 사용자가 입력한 아이디 비밀번호를 데이터베이스에 저장한다. (저장할 때 암호화 작업은 필수이다.)
로그인
은 사용자가 회원가입 때 입력한 아이디와 비밀번호를 입력하면 그 값을 데이터베이스에 암호화 후 저장된 비밀번호와 비교하여 일치하면 로그인에 성공한다. 그 후 사용자 인증 정보가 담긴 access token
을 사용자에게 전송하여 다른 요청부터는 로그인이 필요하지 않다.
인가란 사용자에게 특정 리소스 또는 기능에 대한 액세스 권한을 부여하는 프로세스이다.
사용자가 특정 파일을 다운로드할 수 있는 권한이나 애플리케이션에 관한 액세스 권한 등을 예로 들 수 있다. 인가를 하기 위해서는 인증이 필수로 오기 때문에 인증
-> 인가
로 말할 수 있다.
Session이란 사용자가 사용자가 서버에 접속한 시점부터 연결을 끝내는 시점 동안에 들어온 요청을 하나의 상태로 보고 그 상태를 일정하게 유지하여 클라이언트와 서버가 연결된 상태를 뜻한다. Session을 구분할 수 있는 id를 Session ID라고 부른다.
Cookie란 클라이언트의 컴퓨터에 저장되는 파일로 이름, 값, 만료 날짜/시간(저장기간), 경로 정보 등으로 구성이 되어있다.
Session과 Cookie를 이용한 인증 Flow
로
1. 사용자가 로그인을 하기 위해 인증 정보를 가지고 인증 과정을 요청
2. 인증이 완료되면 Session 정보를 서버의 메모리에 저장 후 해당 Session을 식별 할 수 있는 Session ID 발급
3. Session ID가 저장 될 수 있도록 HTTP Response Header의 Set-Cookie 속성을 이용하여 사용자에게 전달
4. 전달받은 Session ID는 브라우저의 Cookie에 저장 되고, Request를 서버에 보낼 때 함께 전달
5. 서버는 사용자가 보낸 Session ID 와 서버 메모리에서 관리하고 있는 Session ID를 비교하여 Verification을 수행 후 권한을 인가
Session 기반 인증의 장단점
장점으로는 Session ID는 유의미한 개인정보를 담고 있지 않고 서버에서 정보를 관리하므로 데이터의 손상으로부터 상대적으로 안전합니다. 그리고 서버에서 상태를 유지하고 있으므로, 사용자 컨트롤이 쉽다.
단점으로는 서버에서 모든 사용자의 상태를 관리하므로 서버에 부하가 증가한다.
Token을 이용한 인증 Flow
로
1. 사용자가 로그인을 하기 위해 인증 정보를 가지고 인증 과정을 요청
2. 인증이 완료되면 Session을 저장하는 대신 사용자를 식별할 수 있는 Token 발급
3. 발급한 Token은 Response의 Body에 담아 사용자에게 전달, 사용자는 발급된 Token을 local storage에 저장
4. 사용자는 Request를 할 때마다 저장된 Token을 Header 에 포함시켜 서버로 전송
5. 서버는 사용자로부터 전달받은 Header의 Token 정보를 Verification 한 뒤, 해당 유저에 권한을 인가
Token 기반 인증의 장점
장점으로는 Token은 사용자 측에서 저장하므로 서버의 메모리나 DB 등의 부담이 없고 상태 정보도 서버에서 관리하지 않으므로 서버의 Scale Out에 용이, Token 기반의 인증 방식은 서비스를 운영 중인 어떤 서버로든지 Request를 보낼 수 있기 때문에 서버의 확장에 유리하다.