Authentication

백엔드-Authentication

  • 인증이란? : you are who you say you are, 다양한 방법으로 인증 가능하다 통상적으로 password, id 로
    • 먼저 회원가입을 진행해서 서버에 id, passwrod 를 저장한다.
    • 클라이언트는 로그인 할때 회원가입한 id, password를 서버에 전송한다.
    • 어떻게 로그인 상태를 유지할 수 있을까?
  • 세션과 쿠기 (서버에서 사용할 수 있는 전통적인 옵션- 어떻게 로그인 상태를 유지할지에 대한 방법)
    1. 세션
      • 서버에서 확인후 세션을 만든다 (userId, sessiontId, expiration) - Session DB에 저장 or 파일시스템이나 메모리도 될 수 있음
      • 쿠키에 HTTP Only로 sessiontId 정보를 전달함.
      • 다음 요청때마다 쿠키 정보를 전달해줌
      • 장점 : 브라우저에 전달만 하면 되서 간단하고, sessionId 만 전달하면되서 사용자의 정보를 전달하지 않아도 된다. HTTP Only를 사용하면 스크립트로 못읽기 때문에 보안상의 이점도 있다.
      • 단점 : Stateful 하기 때문에 다양한 서버들이 SettionDb를 읽어야 하고 많은 요청이 들어오게 된다. 내부적으로 네트워킹이 많아짐. 성능 하락
    2. JWT (Json Web Token)
      • 다음과 같은 정보를 JSON으로 만들고 토큰화해서 보낸다. header, payload, signature, 모든 정보는 인코딩해서 보내고 서버에서 secrete으로 사용하는 키도 인코딩해서 signature에 포함해서 보낸다.
      • 로그인 하면, 로그인 정보 + 만료 시간 등등 합쳐서 JWT를 만듦.
      • 클라이언트는 Header를 이용하여 모든 request마다 JWT를 포함해서 전달해 줌.
      • 서버는 JWT를 검증한 후에 데이터를 반환함.
      • 장점 : 서버에 State가 없다. 서버를 확장하거나 분산하기에 용이하다.
      • 단점 : JWT 자체가 단점이 될 수 있다. → 계속 JWT를 주고 받아야 한다. 만약 영원히 만료되지 않은 JWT를 헤커가 탈취한다면.. 사용할때 보안에 신경써야 한다.
  • bcrypt 란? : 사용자 정보를 그대로 저장하는 것이 아니라 암호화 해서 저장하기 위해 사용함. → 암호화만 가능한데 (암호화 한것을 비교하는 것), salt 가 없다면 경우의 수로 암호화 해 보면서 유추할 수 있어서 salt를 포함하여 경우의 수를 늘림. 10~12 정도로 설정. 길어지면 cpu 부하 심해짐..
  • JWT, 32 시크릿 키로 권고 됨. 한번 발행된 토근은 변경되면 안된다. → 만약 한버이라도 변경 한다면 최종적으로 붙은 signature도 변경되어서 verify시 오류 발생하고 누군가 변경한 토큰인지 확인 가능하다.
    • 만료될 수 있도록 만들어야 한다. → option으로 전달함. {expiresIn: 2} 이런식으로 → 2초 후에 만료