티스토리 뷰

Spring

세션 인증과 토큰 인증 비교

개발중인 감자 2023. 11. 7. 15:48

🌟 세션 인증

1. 세션이란?

사용자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터,

웹 브라우저를 종료하여, 연결이 끝나는 시점까지

같은 사용자로부터 오는 일련의 요청을 하나의 상태로 보고 그 상태를 일정하게 유지하는 기술 

 

HTTP는 "connectionless", "stateless"인 환경이기 때문에, 

클라이언트가 누군지 매번 서버는 확인하는 과정이 필요하다. 세션은 그 과정을 도와주는 기술이다. 

 

cf. connectionless : 클라이언트가 요청을 한 후 응답을 받으면 그 연결을 끊어 버리는 특징

cf. stateless : 통신이 끝나면 상태를 유지하지 않는 특징

 

 

2. 동작 순서 

1) 클라이언트가 페이지를 요청
2) 서버는 해당 클라이언트의 RequsetHeader에서 Cookie를 확인하여 클라이언트가 해당 SessionID를 보냈는지 확인
3) 만약 SessionID가 존재하지 않으면 서버는 SessionID를 생성하여 클라이언트에게 전달
4) 서버에서 클라이언트에게 전달한 SessionID를 쿠키를 사용하여 서버에 저장 (JSessionID)
5) 클라이언트 재 접속 시 쿠키세션(JSessionID)를 이용하여 sessionID값을 서버에게 전달 (3번 작업 실행)
출처: https://jeongkyun-it.tistory.com/105 [나의 과거일지:티스토리]

 

📝 쿠키란?

쿠키는 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일.
사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지된다는 특징이 있다. 
쿠키는 웹 브라우저(클라이언트)에 저장되고,
세션은 웹 서버에 저장된다.

 

 

3. 세션의 장단점

▶️ 장점

JSESSIONID는 유의미한 값이 아니라 서버에서 세션(사용자) 정보를 찾는 key로만 활용한다. 
따라서 탈취 되었다고 해서 개인정보가 탈취된 건 아니다.

 

▶️ 단점

다만 세션 하이재킹의 위험. 
서버에 세션 정보를 저장할 공간이 필요. 
분산 서버에선 세션을 공유하는데 어려움.

 

 

🌟 토큰 인증 

1.  토큰이란?

세션의 단점 (자원 필요, 분산 서버에서 어려움)을 보완하고자 나온 인증 기술이다. 

인증 받은 사용자는 토큰을 받게되고, 서버에 요청을 할 때마다 헤더에 토큰을 포함시켜

서버에서는 토큰을 통해 사용자를 인증한다. 

 

유저가 로그인하면 서버에서는 토큰을 생성한 뒤 저장하지 않고 (stateless) 토큰 값을 내려준다. 

그래서 토큰에는 유저를 인증할 수 있는 username 같은 정보가 담기게 됨. 

 

 

2. 동작 순서

1) 사용자가 아이디와 비밀번호로 로그인을 한다.
2) 서버 측에서 해당 정보를 검증한다.
3) 정보가 정확하다면 서버 측에서 사용자에게 Signed 토큰을 발급한다. 
(Signed는 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 Signature를 가지고 있다는 것)
4) 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때마다 해당 토큰을 서버에 함께 전달한다. 
이때 Http 요청 헤더에 토큰을 포함시킨다.
5) 서버는 토큰을 검증하고, 요청에 응답한다.
출처: https://mangkyu.tistory.com/55 [MangKyu's Diary:티스토리]

 

 

3. 토큰의 장단점

▶️ 장점

세션관리를 할 필요 없어 별도의 저장소 필요 없음. 
서버 분산&클러스터 환경과 같은 확장성에 좋음.

 

▶️ 단점

한번 제공된 토큰은 회수가 어려움. 
세션의 경우에는 서버에서 세션을 삭제하면 브라우저의 JSSESIONID 는 무용지물임.
그러나 토큰은 세션을 저장하지 않기 때문에, 한번 제공된 토큰은 회수할 수 없다. 
그래서 보통 토큰의 유효기간을 짧게 함. 

토큰에는 유저의 정보가 있기 때문에 상대적으로 안정성이 우려. 
따라서 민감정보를 토큰에 포함하면 안됨. (패스워드, 개인정보)

 

 

 

정리

세션은 서버의 자원을 사용하여 저장하여, 사용자가 보내는 session ID를 통해 인증. 

토큰은 서버에 저장하지 않는 대신 토큰에 저장된 정보를 활용하여 사용자를 인증함. 

 

 

출처

https://jeongkyun-it.tistory.com/105 [나의 과거일지:티스토리]

https://mangkyu.tistory.com/55 [망나니 개발자]

 

'Spring' 카테고리의 다른 글

스프링 시큐리티 (Spring Security) 정리  (1) 2023.11.04