개발을 하는데 로그인한 유저를 어떻게 관리를 해야할까?
주로 쓰는 방식인 세션과 JWT를 알기 전에 쿠키에 대한 개념까지 같이 정리해보았다.
클라이언트 (브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일
Response Header
에 Set-Cookie
속성을 사용하면 클라이언트에 쿠키 만들 수 있음Request
시에 Request Header
를 넣어서 자동으로 서버에 전송일종의 저장공간
서버에 접속한 클라이언트 숫자만큼 세션이 생성된다.
서버의 부담을 주기 때문에 이를 보완하기 위해서 토큰을 이용한 로그인 처리도 많이 사용하는 추세
세션은 클라이언트만의 개인공간이기 때문에 개인 세션 공간에 그 사용자 만의 고유정보를 집어넣고 필요할 때마다 꺼내서 사용하는데 사용합니다.
Ex) 로그인이 성공한 이후에 로그인한 계정의 정보를 집어넣는 식으로 사용
세션이 클라이언트 한명의 개인공간이라면 한개의 웹페이지에 한개의 컴퓨터로 동시에 로그인 불가능하다는 소리지만 같은 브라우저 내의 새로운 탭으로는 동시에 로그인이 불가능하지만 아예 실행중인 브라우저와 다른 브라우저를 실행시켜 로그인하면 되는 이유가 서버는 브라우저 단위로 접속한 클라이언트를 확인하기 때문입니다.
DB
와 서버를 확장해야 함A
와 B
의 DB
로 나뉘어졌을때 세션 A
에 저장되어 있는데 request를 보낼 때 A
에서 통신하도록 추가적인 기술 필요session cookies
와 비슷세션의 단점을 어느정도 해결할 수 있는 기술
.
을 기준으로 구분되어 header, payload, signature로 구성
암호화되지 않아서 누구나 확인할 수 있기 때문에 JWT에 담으면 안된다.
{
"alg" : "HS256",
"typ" : JWT
}
http-only
를 사용한다면 HTTPS로만 쿠키가 전달되기 때문에 보안 강화, CSRF 문제에 대해서는 CSURF 같은 라이브러리를 사용함으로 해결세션방식에서 서버는 로그인 된 유저의 정보를 모두 저장하고 있어서 유저들의 통제가 JWT보다 비교적 쉽다. 만약 PC와 모바일기기에서 동시 접근하는 것을 막고 싶을 때 강제 로그아웃 시키는 기능은 세션을 통해 구현이 가능하다.
JWT
를 서버가 발급하고나면 JWT
를 관리하지 않는다. 오직 JWT
를 받았을 때 JWT
가 유효한 것인지만 확인하기 때문에 서버 자원과 비용을 절감할 수 있다. 그러나 JWT
가 수명이 길어서 제 3자에게 탈취당할 경우가 발생할 수 있다.
* 이를 보완한 방법 중 하나로 access token
& refresh token
방식이 있는데 두개의 토큰 모두 JWT
이다.
access token
&refresh token
방식은 토큰 들에 유효기간을 주어서 보안을 강화시킨 것이다.Access token
은 유효시간이 짧은 토큰이고,refresh token
은access token
보다 유효기간이 긴 토큰이다.
access token
, refresh token
2개의 토큰을 받는다. 이때 서버는 refresh token
을 안전한 저장소에 저장한다.access token
의 유효 기간이 지나지 않은 경우 사용자가 어떤 요청을 보낼 때 access token
을 함께 보내고 서버는 유효한지 확인 후 응답access token
의 유효 기간이 지난 경우 사용자는 refresh token
과 함께 요청을 보내고, 저장소에 저장되어 있던 refresh token
과 비교한 후에 유효하다면 새로운 access token
과 응답을 함께 보낸다.그동안은 스프링 시큐리티에서 지원해주는 세션 관리를 이용하였는데 로그인 유저가 많고, 서비스의 사이즈가 컸을 때는 다른 WAS의 로그인 사용자를 구별하기의 어려움이 있을 것 같아 access token과 refresh token을 사용하는 JWT가 대규모 서비스에는 맞는 전략인 것 같다.
출처 : Guide to Spring Session | Baeldung
Java-Spring 로그인 Seesion 처리
쿠키와 세션에서 세션은 어디에 저장되는가? - 현구막 기술 블로그
Spring Boot Session과 Cache의 기본 저장소 !