HTTP Protocol의 특징
- connectionless: 요청에 따른 응답을 받으면 연결이 끊어진다.
- stateless: 통신이 종료되면 상태정보가 남지 않는다.
따라서 로그인 후 페이지를 새로고침하면 로그인 상태가 유지되지 않는다.
로그인 상태를 유지하기 위해 서버(세션, 쿠키) 기반 인증과 토큰 기반 인증 방식을 사용한다.
서버 기반 인증 - Cookie or Session
- 처음 사용자가 로그인 시 응답과 함께 세션id를 반환해야 함
- 사용자는 세션id를 받아 쿠키에 저장한 후, 인증이 필요한 요청마다 쿠키를 헤더에 포함시켜 서버에 요청함
- 서버는 쿠키를 받아 세션 저장소에서 대조함
토큰 기반 인증 - JWT
- 로그인 시 계정 검증 후 사용자에게 토큰 발급
- 클라이언트는 토큰을 저장해두고 서버에 요청할 때마다 전달
- 서버가 토큰을 검증 후 요청에 응답
JWT (Json Web Token)
json 형식의 데이터를 저장하는 토큰
헤더, 페이로드, 시그니처 세 부분으로 구성됨
- 헤더: 토큰 종류와 해시 알고리즘 정보
- 페이로드: 토큰의 내용물이 인코딩된 부분
- 시그니처: 토큰 변조 여부를 확인할 수 있는 일련의 문자열
access token & refresh token
access token: 인증을 위한 JWT, 보안을 위해 유효기간이 매우 짧음
이를 보완하기 위해 refresh token 사용
로그인 구현 방법
- 로그인시 Access token과 Refresh token 모두 발급
- 쿠키에 두 토큰 모두 저장
- 서버측의 DB에는 refresh token만 저장함
- 두 토큰 모두 만료된 경우 에러, 한 토큰이 만료된 경우 재발급
- 두 토큰 모두 유효할 시 다음 미들웨어로
- 로그아웃 시 두 토큰 만료시킴
비교
세션 인증의 경우
토큰 인증의 경우
-
stateless : 상태를 유지하기 않기 때문에 클라이언트측에서 들어오는 요청만으로 작업을 처리한다.
-
클라이언트-서버 간의 연결이 없기 때문에 서버 확장성이 향상됨
-
인증정보를 다른 어플리케이션으로 전달할 수 있기 때문에 SNS 계정 로그인도 가능