Cookie / Session / Token 인증 방식 종류
일반적으로 서버가 클라이언트 인증을 확인하는 방식은 크게 쿠키, 세션, 토큰 3가지 방식이 있다.
Cookie 인증
쿠키는 Key-Value 형식의 문자열이다.
클라이언트가 어떤 웹사이트에 방문하면, 그 사이트의 서버를 통해 브라우저에 설치되는 정보 기록용 파일이다. 그래서 각 사용자마다 고유 정보 식별이 가능해진다.
Cookie 인증 방식
- 브라우저가 서버에 요청을 보낸다.
- 서버는 요청에 대한 응답에 브라우저에 저장하고 싶은 정보를 응답 헤더의 Set-Cookie에 담는다.
- 이후 브라우저는 요청을 보낼 때마다 저장된 쿠키를 요청 헤더의 Cookie에 담아 보낸다. 서버는 쿠키에 담긴 정보를 바탕으로 요청의 주체를 식별한다.
Cookie 방식의 단점
- 보안에 취약하다.
- 요청 시 쿠키의 값을 그대로 보내기 때문에 유출 및 조작의 위험이 있다.
- 용량 제한이 있다.
- 웹 브라우저마다 쿠키에 대한 지원 형태가 달라서 브라우저 간 공유가 불가능하다.
- 쿠키의 사이즈가 커질수록 네트워크에 부하가 심해진다.
Session 인증
위의 쿠키 인증에 대한 보안 위험 때문에, 세션에서는 비밀번호와 같은 민감한 정보를 브라우저가 아닌 서버 측에 저장을 하고 관리한다.
서버의 메모리에 저장하거나, 아니면 로컬 파일이나 데이터베이스에 저장하기도 한다. 즉, 클라이언트가 아닌 서버에서 관리를 한다.
세션 객체는 Key에 해당하는 Session id와, 이에 대응하는 Value로 구성되어 있다.
Value에는 세션 생성 시간, 마지막 접근 시간 및 사용자가 저장한 속성 등이 Map 형태로 저장된다.
Session 인증 방식
- 유저가 웹사이트에서 로그인하면 세션이 서버측(메모리 혹은 DB)에 저장된다.
- 서버에서 브라우저에 보낼 쿠키에 Session id를 저장한다.
- 브라우저는 요청마다 Session id를 쿠키에 담아 전송한다.
- 서버는 클라이언트가 보낸 Session id와 서버 메모리로 관리하고 있는 Session id를 비교하여 인증을 수행한다.
Session 방식의 단점
- 세션 id 자체는 유의미한 개인정보를 담고 있지 않더라도, id가 탈취당하면 클라이언트인 척 위장할 수도 있다.
- 물론 이는 서버에서 IP 특정을 통해 해결이 가능하긴 하다
- 서버에서 세션 저장소를 사용하므로 요청이 많아지면 서버에 부하가 심해진다.
Token 인증
토큰 기반 인증은 서버에서 인증이 완료되면 클라이언트에 토큰을 부여하는데, 이 토큰은 유일하여 클라이언트가 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 함께 보내고, 서버에서는 일치 여부를 체크하여 인증을 처리한다.
기존의 세션 기반 인증은 서버가 세션 정보를 가지고 있어야 하고, 이를 조회하는 과정이 필요하기 때문에 많은 오버헤드가 발생하지만, 토큰은 클라이언트에 저장이 되기 때문에 서버의 부담을 덜 수 있다.
토큰은 쿠키나 세션이 없는 앱과 서버가 통신 및 인증할 때 많이 사용된다.
Token 인증 방식
- 로그인 후, 서버는 클라이언트에게 유일한 토큰을 발급한다.
- 클라이언트는 서버측에서 전달받은 토큰을 쿠키나 스토리지에 저장해두고, 서버에 요청을 할 때마다 해당 토큰을 요청 헤더에 넣어서 전달한다.
- 서버는 전달받은 토큰을 검증하고, 요청에 응답한다. 토큰에는 요청한 사람의 정보가 담겨있기 때문에 따로 DB를 조회하지 않고도 식별할 수 있다.
Token 방식의 단점
- 쿠키나 세션과 다르게 토큰 자체의 길이가 길어서, 인증 요청이 많아질수록 네트워크 부하가 심해질 수 있다.
- payload 자체는 암호화 되지 않기 때문에 유저의 중요한 정보는 담을 수 없다.
- 토큰을 탈취당하면 대처가 어렵다.
JWT (JSON Web Token)
JWT란, 인증에 필요한 정보들을 암호화 시킨 JSON 토큰을 의미한다.
JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이며, 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 들어있다. 따라서 클라이언트가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며, 검증이 완료되면 응답한다.
Base64 URL-safe Encode 란, 일반적인 Base64 Encode에서 URL에서 오류없이 사용하도록 +, / 를 각각 -, _로 표현한 것이다.
참고 링크
'TIL ✍️' 카테고리의 다른 글
24년 1월 3일(수요일) - 63번째 TIL (0) | 2024.01.04 |
---|---|
24년 1월 2일(화요일) - 62번째 TIL (1) | 2024.01.03 |
23년 12월 27일(수요일) - 60번째 TIL (0) | 2023.12.27 |
23년 12월 26일(화요일) - 59번째 TIL (0) | 2023.12.26 |
23년 12월 22일(금요일) - 58번째 TIL (1) | 2023.12.22 |