계정정보 자체를 헤더에 담는다. 인증을 테스트 할 때 빠르게 시도해 볼 수 있지만 당연히!! 보안에 취약하다. 그리고 요청이 올 때마다 서버는 전달받은 데이터로 해당 유저가 맞는지 검증해야 하므로 비효율적이다.
쿠키와 세션은 서버의 세션과 사용자 쿠키를 기반으로 하는 인증 방식이다.
특징 | 쿠키 | 세션 |
---|---|---|
저장위치 | 브라우저 | 서버 |
보안 | 낮음 | 높음 |
속도 | 빠름 | 느림 |
라이프사이클 | 설정해둔 유효시간만큼 | 브라우저 종료시 만료 |
🙋 캐시는 정적 파일을 브라우저에 저장해놓고 사용하는 것
출처
1. 클라이언트가 로그인을 위해 정보를 서버에 전달한다
2. 전달받은 정보로 회원 db와 비교해 사용자를 확인한다
3. 로그인 성공시 사용자를 식별할 수 있는 고유한 세션 ID 를 생성해 세션 저장소(DB나 메모리, 보통 redis를 많이 사용한다)에 저장한다
4. 세션ID를 응답에 담아보내면 클라이언트는 해당 값을 쿠키에 저장한다
5. 이후 요청에는 헤더에 쿠키를 실어서 전달한다
6. 서버는 쿠키를 받아 세션 저장소에 저장된 세션ID인지 확인하고, 유여한 쿠키일 경우 요청받은 데이터를 반환한다
쿠키가 노출되어도 큰 문제가 없고, 요청을 주는 사용자마다 고유 세션ID가 있어 일일이 회원정보를 확인할 필요가 없다. 하지만 쿠키가 아닌 클라이언트 요청 자체를 탈취하면(하이재킹) 해커의 요청을 사용자로 인식하게 된다. (이를 방지하기 위해 세션의 유효시간을 짧게 하고, HTTPS를 사용해 보안성을 높인다). 그리고 세션ID를 모든 서버에서 이용할 수 있어하므로, 중앙 세션 저장소가 없으면 시스템 확장이 어렵다. 중앙 세션 저장소에 장애가 발생하면 인증 전체에 문제가 생길 수 있다.
JWT는 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다. Access Token을 HTTP 헤더에 실어 서버로 보낸다. 쿠키/세션방식은 세션 저장소가 필요하기 때문에 메모리 과부하 문제가 생길 수 있지만, JWT 방식은 서버 리소스를 사용하지 않는다.
출처
1. 사용자 로그인
2. 서버에서 계정정보를 읽어 사용자를 확인한 후, 사용자의 고유한 ID 값을 부여하고 기타 정보와 함께 payload에 넣음
3. JWT 토근 유효기간 설정
4. 암호화할 SECRET KEY를 이용해 ACCESS TOKEN을 발급한다
5. 사용자는 Access Token을 받아 저장한 후, 인증이 필요한 요청마다 토큰을 헤더에 실어 보낸다
6. 서버에서는 해당 토큰의 Verify Signature를 SCRET KEY로 복호화한 후, 조작 여부, 유효 기간을 확인한다.
7. 검증이 완료되면 payload를 디코딩하여 사용자의 Id에 맞는 데이터를 가져온다
📑 refence