유저기능원리, 인증과 인가

티라노·2023년 12월 12일
2
post-custom-banner

유저 기능이란

  • 인증: 리퀘스트를 보낸 사용자가 누구인지 파악
  • 인가: 리퀘스트마다 할 수 있는 것을 제한

인증: 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 실페 리스폰스 전달
profile
어쩌다 프론트 도전기
post-custom-banner

0개의 댓글