🔑 인증(authentication)과 인가(authorization)
인증(authentication)이란 리소스에 대한 접근을 요청하는 주체의 신원을 검증하기 위한 활동입니다. 비밀번호나 생체인식 등을 활용하여 자격이 있는 주체인지 확인합니다.
인증의 방법에는
- 기본 인증(basic authentication)
- 사용자의 아이디와 비밀번호를 base64로 인코딩
- 인코딩 된 아이디와 비밀번호를 'Authorization' 헤더에 포함시켜 서버로 전송하는 방법
- 가장 단순한 인증 방법 중 하나
- 세션 기반 인증(session based authentication)
- 서버가 사용자를 식별할 수 있는 세션을 생성
- 해당 세션 id를 클라이언트에 전달하여 인증을 유지하는 방법
- 토큰 기반 인증(token based authentication)
- 서버는 클라이언트에게 토큰을 발급
- 클라이언트는 요청을 보낼 때 서버가 발급해준 토큰을 'Authorization' 헤더에 포함시켜 서버로 전송하는 방법
- 대표적으로 JWT(JSON web token)가 존재
- etc...
등이 존재합니다.
위와 같은 방법들로 주체의 신원을 확인하여 해당 주체가 리소스에 접근할 수 있는 자격이 있다는 것이 증명되면, 인가가 이루어집니다.
인가(authorization)란 전송된 리퀘스트가 어떤 권한을 가지고 있는지 판단하는 과정입니다. 인증이 완료된 주체에게 리소스에 대한 접근을 허용하고 특정한 업무를 수행할 권리를 부여합니다.
아래에서 세션 기반 인증과 토큰 기반 인증을 자세히 살펴보겠습니다.
🔑 세션 기반 인증(session based authentication)
사용자의 인증 정보가 서버의 세션 저장소에 저장되는 방식으로, 세션 ID는 쿠키 형태로 클라이언트에도 저장되지만 실제 인증 정보는 서버에 저장되어 있습니다.
세션 기반 인증은 앞서 설명한대로 서버가 사용자를 식별하기 위해 세션을 생성하고, 해당 세션의 ID를 클라이언트에게 전달합니다.
클라이언트가 모든 요청마다 서버에게 받은 세션 ID를 포함하여 보내면 서버는 이것으로 사용자를 식별합니다.
세션이 유지되는 동안 인증 상태 또한 유지됩니다.
세션 기반 인증의 워크플로우는 다음과 같습니다.
- 사용자가 로그인을 진행합니다.
- 브라우저는 http의 포스트 요청을 통해 사용자의 로그인 정보를 서버로 전송합니다.
- 서버는 받은 로그인 정보를 사용자 데이터베이스에 저장된 정보와 대조하여 유효성을 검사합니다.
- 유효성이 증명되면 서버는 해당 사용자(브라우저)를 위한 세션(session)을 생성하고, 고유한 세션 ID를 브라우저에게 쿠키 형태로 전달합니다.
- 브라우저는 받은 세션 ID를 포함한 요청을 서버에게 전송합니다.
- 서버는 해당 세션이 유효한 지 확인 후 브라우저가 보낸 요청을 처리합니다.
- 세션이 만료되거나 사용자가 로그아웃 하면 서버는 해당 세션을 삭제합니다.
🔑 토큰 기반 인증(token based authentication)
사용자의 인증 정보를 클라이언트가 직접 가지고 있는 방식으로, 인증 정보가 토큰의 형태로 브라우저의 로컬 스토리지나 쿠키에 저장됩니다.
토큰 기반 인증은 앞서 설명한대로 서버가 클라이언트에게 사용자 인증 정보가 담긴 토큰이라고 하는 고유한 문자열을 발급합니다.
가장 많이 사용되는 토큰의 형태는 JWT(JSON web token)으로 인증에 필요한 다양한 정보들을 암호화한 토큰입니다.
토큰 기반 인증의 워크플로우는 다음과 같습니다.
- 사용자가 로그인을 진행합니다.
- 브라우저는 http의 포스트 요청을 통해 사용자의 로그인 정보를 서버로 전송합니다.
- 서버는 받은 로그인 정보를 사용자 데이터베이스에 저장된 정보와 대조하여 유효성을 검사합니다.
- 유효성이 증명되면 서버는 JWT 같은 형식의 토큰을 브라우저에게 전달합니다.
- 브라우저는 받은 토큰을 'Authorization' 헤더에 포함시켜 서버에게 요청을 전송합니다.
- 서버는 해당 토큰이 유효한 지 확인 후 브라우저가 보낸 요청을 처리합니다.
- 토큰이 만료되거나 사용자가 로그아웃 하면 서버는 해당 토큰을 삭제합니다. (리프레시 토큰을 사용하여 갱신할 수도 있습니다.)
JWT 형식이 무엇인지와 다른 인증 방식에 대한 내용은 다음 블로그를 참고해주세요
읽어주셔서 감사합니다:)