2023. 11. 5. 23:24ㆍ기술공부
쿠키 : 사용자를 기억하기 위해 서버가 사용자의 브라우저에 저장하는 데이터라고 할 수 있다.
(request)
--------->
브라우저 서버
<---------
(response) : 브라우저에 저장하고자 하는 쿠키
이 쿠키를 부라우저에 저장하게 되면, 사용자가 방문할 때 마다 브라우저가 자동으로 해당 쿠키를 요청과 함께 보내게 된다.
쿠키의 특징:
1) 도메인에 따라 제한됨 ex) 네이버에서 준 쿠키는 네이버에만 보내지게 됨
2) 유효기간이 있음(유효기간이 있는 경우 브라우저가 종료되어도 인증이 유지됨)
세션과 토큰의 필요성
HTTP는 stateless하다. 그러기 때문에 서버로 가는 모든 요청이 독립적으로 다루어진다. 이러한 이유로 요청을 할 때마다 누구인지를 계속 알려줘야 한다.
로그인 기능은 인증(Authentication) 과 인가(Authorization)으로 나뉜다.
인증 -> 로그인
어떤 사이트에 가입된 회권, 즉 특정 서비스에 일정 권한이 주어진 사용자임을 아이디와 패스워드를 통해 확인받는 과정이다.
인가 -> 허가
한 번 인증을 받은 사용자가 이후 사이트의 여러 기능들을 사용할 때 해당 사용자가 로그인되어 있음을 알아보고 허가해주는 것이다.
사용자의 브라우저에 로그인 정보를 저장하고 매 요청마다 인증을 반복하기에는 무겁고 비효율적이다. 이러한 인가 문제를 해결하기 위한 방법이 세션과 토큰이다.
세션 : Session ID를 사용해 어떤 사용자가 서버에 로그인 되어있음이 지속되는 상태
-> 로그인 성공 시 서버는 세션 DB라는 곳에 데이터를 저장하고 해당 Session ID라는 것을 쿠키를 통해 브라우저로 돌아와 해당 사용자의 브라우저에 저장된다. 이 브라우저는 해당 사이트를 이용할 때 Session ID가 저장된 쿠키를 자동으로 보내 응답을 받는다. 서버는 해당 Session ID를 가지고 세션 DB를 확인하고 사용자를 확인한 후 허가한다.
단점 :
1. 동시접속이 많아질 경우 메모리가 부족해지고, 서버에 문제가 생겨 메모리가 꺼진다면 휘발성이기 때문에 모두 날아가고 모든 사용자의 로그인이 튕길 것이다.
2. 위 단점을 해결하기에 하드디스크나 데이터베이스를 이용하기엔 속도가 느리다.
3. 여러대의 서버로 로드밸런싱을 할 경우 각각의 서버의 사용자 데이터가 모두 다르기 때문에 세션 유지가 안된다.
-> 레디스나 MemCached같은 메모리형 데이터베이스 서버를 사용함으로 해결할 수 있다.(데이터 파티셔닝을 통해 데이터를 분산저장하기때문)
JWT(JSON Web Token) -> Json으로 된 웹토큰이라는 뜻이다.
JWT는 헤더와, 페이로드, 서명으로 구분된다. Base64로 디코딩해서 나오는 데이터들은 누가 누구에게 언제 발급했는지, 언제까지 유효한지, 서비스가 사용자에게 공개하기 원하는 내용들의 정보들이다.
서버를 사용자가 요청과 함께 실어보낸 토큰의 1번 헤더와 2번 페이로드, 그리고 '서버에 감춰놓은 비밀 값'이 셋을 헤더에서 명시한 암호화 알고리즘에 넣고 돌린다. 그것이 3번 서명 값과 일치한다면 인가하게 된다.
이러한 JWT방식은 세션과 다르게 사용자들의 상태를 저장할 필요가 없이 요청이 들어올 때마다 비밀값으로 확인만 해주면 되기에 앞서 언급했던 세션의 문제점을 해결해 줄 수 있다.
단점:
1) 토큰의 무효화가 불가능하기 때문에 통제가 쉽지 않다.
위의 단점을 해결한 방식이 있다
1. access토큰(수명이 짧음)과 refresh토큰(수명이 김)을 발급하고 클라이언트에게 보냄
2. 서버는 refresh 토큰은 상응값을 데이터베이스에도 저장
3. 이후 사용자의 access토큰이 수명을 다하면 사용자는 refresh토큰을 서버에 보냄
4. 서버는 해당 토큰을 데이터베이스에 저장한 값과 대조해보고 맞다면 새 access토큰을 발급
-> refeash토큰만 안전하게 관리되면 이것이 유효할 동안으느 access토큰이 만료될 때마다 새로 발급받을 수 있다.
'기술공부' 카테고리의 다른 글
@NoArgsConstructor(access=Level.PROTECTED) (0) | 2023.11.26 |
---|---|
AOP(Aspect Oriented Programming)/Spring (1) | 2023.11.20 |
WEB 서버와 WAS의 차이 (0) | 2023.11.13 |
매트릭 데이터 수집 (0) | 2023.01.11 |
Docker (0) | 2023.01.11 |