네트워크의 토큰과 세션에 관하여..
면접에서 나온 질문인데, 분명 기술 질문 관련해서 정리하면서 몇번 읽었던 내용이었지만,
실제로 접하며 느낀 적이 없어서 그런가 깔끔하게 대답을 못해서 다시 정리한다.
세션과 토큰이 나온 배경
- HTTP 의 stateless 특성 때문에, 로그인 등의 상태를 유지해야 하는 경우를 보완하기 위해 나옴.
세션이란?
- 통신을 하기 위해서 서로 연결된 순간부터 통신을 마칠 때 까지의 기간
- 즉, HTTP 세션이란 클라이언트가 웹서버에 연결된 순간부터 통신 종료 까지의 기간
- 쿠키를 기반으로 동작한다. (여기서 쿠키는, 세션에 앞서 stateless 문제를 해결하기 위해 나왔다)
- 보안 문제 등으로 세션 아이디만 쿠키에 넣어 왔다갔다 할 수 있도록 세션을 만들었다.
- 쿠키만 있을 때에는 쿠키 자체에 로그인 정보 자체를 넣어서 보내기 때문에 탈취 당하면 문제가 됨
- 그나마 세션을 적용하면 쿠키 안에 세션ID 등만 들어있기에, 탈취 당해도 시간이 지나면 세션 expired 등으로 보호를 할 수 있음.
- 인증 성공 후 세션 관련 정보를 DB에 저장하여, 많아지면 부하가 생길 수 있고 확장성이 좋지 않다.
세션이 사용되는 방법
- 클라이언트: 로그인한다 (request)
- 서버: 로그인사용자를 검증, 유효하면 고유ID를 세션저장소에 저장 후 세션ID를 만들어서 반환 (response)
- 클라이언트: 세션ID 저장 후, 이제 End point (인증 필요 요청) 접근 시에 쿠키에 세션ID를 넣어서 요청 (request)
- 서버: 쿠키에서 세션ID를 확인하고 저장소(DB)에서 검증 후 요청에 대한 응답 반환 (response)
토큰이란?
- 인증을 수행하는 방법 중 하나이다.
- 세션기반은 서버의 메모리 또는 DB에 유지하여 서버에 부하가 발생할 수 있으나,
토큰은 서버에서 검증만 하면 되기 때문에 서버 부담이 적고 확장성을 높였다.
토큰이 사용되는 방법
- 클라이언트: 로그인한다 (request)
- 서버: 로그인사용자를 검증, 유효하면 토큰을 발급한다 (response)
- 클라이언트: 토큰을 저장하고, 이제 End point (인증 필요 요청) 접근 시에 토큰을 헤더에 담아서 요청 (request)
- 서버: 토큰을 검증하고 요청에 응답 반환 (response)
세션과 토큰의 차이점은?
- 토큰은 클라이언트 측에 저장이 되고, 세션은 서버의 메모리나 데이터베이스에 저장된다.
- 위 이유 때문에 안정성은 -> 세션 > 토큰
- 토큰 사이즈 > 세션 ID 사이즈
- 세션의 경우 클러스터 / 분산서버 환경에서 요청이 나뉘는 경우 요청이 들어가는 서버에 따라서 상태가 변할 수 있다.
- 따라서, 토큰을 사용하는 것이 일반적 (확장성이 좋다)
'Programming' 카테고리의 다른 글
[Database] Optimistic lock(낙관적 잠금), Pessimistic lock(비관적 잠금) 에 관하여.. (0) | 2021.09.06 |
---|---|
[Database] 트랜잭션 격리수준에 관하여.. (데이터베이스 Transaction isolation level) (0) | 2021.08.31 |
Deadlock 데드락에 관하여.. 멀티쓰레드 사용 시, (0) | 2021.08.26 |
Java 의 final keyword 에 관하여.. (0) | 2021.08.26 |
Spring framework, @Transactional(readOnly=true), 스프링 프레임워크 읽기 전용 트랜잭션을 하는 이유는? (0) | 2021.08.03 |