유저 기능이란
- 인증: 리퀘스트를 보낸 사용자가 누구인지 파악
- 인가: 리퀘스트마다 할 수 있는 것을 제한
인증: Authentication
- 서버가 리퀘스트를 보낸 사용자가 누구인지 파악하는 기능
- 이를 위해 서버에서 유저 모델을 만듦
- 유저 모델: 특정 리소스를 관리하기 편하게 코드로 정리해 놓은 것
- id(email) - 중복되면 안됨
- pw - 암호화 필요
- 회원가입 - 서버에 유저데이터 저장
- 리퀘스트로 받은 인증 정보 말고도 id가 정수값으로 자동 저장됨(1씩 자동으로 증가)
- 로그인
- 로그인 리퀘스트 보냄 → 이메일로 어떤 유저가 로그인을 원하는지 찾고, 비밀번호로 확인
- 실패하면(400), 성공하면 (200 + 인증서(유저증명서같은것))를 보냄
- 이후 모든 리퀘스트에 이 인증서를 붙여서 같이 보내줘야 해당 유저가 누구인지 알 수 있음
- 인증서: 보통 만료기한이 있음. =로그아웃
- 클라이언트와 서버가 어떤 종류의 인증서를 어떻게 관리할지에 따라 여러 방법이 있음
쿠키 인증
- 쿠키
- 서버 리스폰스나 클라이언트 코드에 따라 브라우저에 저장되는 작은 단위의 문자열 파일들
- 하나의 문자열은 이름, 값, 속성으로 이루어져있고, 세미콜론으로 구별되어 있음.
- 서버에서 유저 확인을 마친 후
- 인증서를 만들어 리스폰스에 Set-Cookie 헤더를 통해 클라이언트에 전달할 헤더로 전달함
- 리스폰스를 받은 클라이언트 브라우저는 쿠키의 이름과 값을 저장하고, 각 속성을 적용함.
- 이렇게 저장한 쿠키는 이후에 리퀘스트를 보낼 때 자동으로 Cookie라는 헤더로 저장돼서 보내짐. (
Authorization 헤더 인증
- 쿠키는 자동으로 인증이 관리됨. 수동으로 인증을 관리하고 싶다면? 클라이언트가 인증서를 직접 저장하고 리퀘스트의 Authorization 헤더를 통해 인증을 보내는 방법
- 서버에서 유저 확인을 마친 후
- 서버는 Set-Cookle 헤더가 아니라 바디에 인증서를 추가해 클라이언트로 보냄
- js 코드로 인증서를 저장한 후 필요할 때 사용. 즉, 쿠키를 전송이 아니라 단순 저장 수단으로만 사용 (쿠키or로컬스토리지 둘 중 하나에 저장하고 읽어오면 됨)
- 리퀘스트를 보낼 때
Authorization : (인증서값)
를 써서 보내줌
- Authorization 헤더 인증 장점
- 리퀘스트에 인증서를 붙일지 안 붙일지 선택 가능. (여러 인증서 중 선택해서 보내거나 등)
- 서로 다른 루트 도메인 사이에서 인증 가능
- 주의할 점: 비밀번호 같이 민감한 정보는 쿠키나 로컬 스토리지에 절대 저장 X(두 인증 방법 모두)
두 가지 인증서 종류: 세션, 토큰
세션 기반 인증
- 세션: 서버가 저장하는 사이트 방문자들에 대한 기록
- 각각의 방문자에 대한 session id, ip주소, 마지막 접속 시간, 브라우저 종류 등을 저장
- 그리고나서 리스폰스 Set-Cookie 헤더에 새로 만든 session id 값을 추가하여 클라이언트에 저장.
- 앞으로의 리퀘스트에서 session id만 보고 방문자가 누구인지 알 수 있음. (세션 아이디가 없다면 첫 방문이라고 유추 가능)
- 해당 유저가 로그인을 하면 해당 session id의 데이터에 user id 정보를 추가 (로그인 전이면 null)
- 특정 시간이 지나거나 로그아웃을 하는 등 특정 행동을 하면 유저 기록이 만료되어 다시 인증해야 함
토큰 기반 인증
- 인증 토큰: 유저에 대한 정보를 암호화한 문자열
- 서버가 토큰을 만듦.
- 아이디, 만료일 등의 정보를 서버만 가지고 있는 비밀키로 암호화하여 토큰을 발행
- JWT(json web token)을 자주 사용함
- 토큰은 보통 Authorization 헤더 인증 방식으로 주고받는 것이 일반적임.
- 서버가 Authorization 헤더로 토큰 값을 받으면, 비밀키로 암호화를 풀어서 개인 정보 확인.
JWT(JSON Wen Token) 토큰
- 구성요소
- Header: 토큰 자체에 대한 데이터 저장되어 있음
- Payload: 토큰이 실질적으로 저장하려는 정보(토큰값, 유저 아이디 등 저장할 데이터 종류의 제한은 없음. 공식 이름을 최대한 활용할 것)
- Signature: 토큰을 믿을 수 있는지 확인하기 위한 데이터 저장
- Header + Payload + 서버 비밀키 ← 3가지 합쳐져서 만들어짐
- 주의: 토큰의 헤더와 패이로드 부분을 단순 인코딩된 거기 때문에 아무나 볼 수 있음. 개인정보 최대한 자제할 것.
인가: Authorization
- 인가: 리퀘스트가 어떤 권한이 있는지 판단(리퀘스트 내용을 요청할 권한이 있는지)
- ex: 게시물 삭제 리퀘스트:
- 리퀘스트와 함께 온 인증서를 통해 해당 유저가 관리자or글 작성자인지 확인
- 맞다면 요청대로 글 삭제, 아니면 400 실페 리스폰스 전달