웹 개발을 하면서 '인증'을 어떠한 방법으로 해야할까 고민해보았다.
Firebase 는 방법이라기보다는 툴에 더 가까운것 같지만 넣어두었는데(Firebase 도 토큰 기반 인증을 이용할 수 있으므로), 어쨌든 인증 기능에 대한 한 가지 방법이므로 넣었다.
조금이라도 금전적인 지원이 가능하다면 Firebase 를 backend 로 사용하는게 좋아보인다.
1. FireBase (Google)
- Baas(Backend as a Service), 백엔드/서버 측 코드를 작성하지 않고 클라우드와 연동해 응용 프로그램을 효율적으로 개발할 수 있는 환경을 제공하는 것
- 실시간 데이터베이스, 사용자 인증, 클라우드, 호스팅, 오류 보고, 광고 수익 등의 기능을 제공
- 하지만 무료 요금제는 프로젝트 당 하나의 데이터베이스만 사용할 수 있다. (개인적으로 지금 걸리는 단점)
2. Cookie & Session
- 서버에서는 세션을 이용해 인증을 책임지고, 사용자는 쿠키를 이용해 쿠키를 받아 세션의 정보를 접근하는 인증 방식
- 기본적으로 세션 저장소를 필요로 함(서버 부하가 높아짐)
- 사용자의 HTTP 요청을 가로채서, 훔친 쿠키를 이용해 HTTP 요청 가능(세션 하이재킹)
3. JWT (Json Web Token)
- JWT 는 웹표준(RFC7519)으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적(self-contained) 방식으로 정보를 안정성 있게 전달함 (자가수용적은 아래 더보기 참고)
더보기
* 자가수용적이란?
JWT 는 필요한 모든 정보를 자체적으로 지니고 있다. JWT에서 발급된 토큰은
1. 토큰에 대한 기본정보
2. 전달할 정보
3. 토큰 검증 증명 정보 (signature)
를 포함한다.
- JWT 는 서버/클라이언트 정보 전달 시 Http 헤더에 JSON 토큰을 넣은 후,
- 서버는 별도의 인증 과정없이 헤더에 포함되어 있는 JWT 정보를 통해 인증함 - 세션/쿠키와 같이 별도의 저장소 관리가 필요하지 않음
- 상태를 저장하지 않기때문에 서버를 확장하거나 유지/보수한데 유리함
- 데이터베이스에 의존하지 않은 쉬운 인증/인가 방법 제공 - 토큰 기반 다른 인증 시스템에 접근이 가능하므로 확정성이 뛰어남
- 이미 발급된 JWT 는 유효기간이 만료될때까지 사용할 수 있기 때문에, 토큰을 탈취당하면 정보가 계속 유출됨
- Referesh Token 으로 어느정도 보완 가능 - 토큰은 클라이언트에 저장되기 때문에, 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용이 불가능
- Paylaod 정보가 제한적임 ( 클라이언트의 중요한 정보는 넣을 수 없음 )
- 거의 모든 요청에서 토큰이 생성되므로, 데이터 트래픽 크기에 영향을 미칠 수 있음
* 어떤 환경에서 JWT 를 사용해야 하는가?
- 회원 인증 : JWT 를 사용하는 가장 기본 시나리오
- 서버에서는 사용자에 대한 세션을 유지할 필요가 없음. ( 사용자의 로그인 여부를 신경 쓸 필요가 없음 )
- 서버는 클라이언트 요청 시 토큰 확인만 하므로, 서버 자원과 비용 절감 가능
- 클라이언트 로그인
- 서버는 클라이언트 요청을 받을때 마다, 토큰이 유효하고 인증되었는지 검증하고
요청한 작업에 권한이 있으면 작업을 처리함
- 정보 교류 : JWT 는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋음
- 정보에 서명에 되어있기 때문에 정보 보낸이/내용의 조작 여부를 검증 가능
1. Firebase 참고
2. JWT 참고
www.opennaru.com/opennaru-blog/jwt-json-web-token/