클라이언트와 서버 간의 요청, 응답을 위해서 HTTP 프로토콜 사용한다. 거의 모든 웹서비스는 HTTP 프로토콜 기반이다. HTTP 프로토콜은 Stateless한 특징을 가지고 있기 때문에 매번 번거로운 사용자 인증, 인가 절차를 해결하기 위해서 Session과 Token 방식을 많이 사용하고 있다. Session과 Token의 차이점을 간단히 비교하고 본문의 내용에선 Session에 관한 부분을 Deep Dive 해보도록 하겠다.
HTTP 프로토콜에 대한 이해
- Stateless(무상태성)한 프로토콜이기 때문에 요청 - 응답 사이클마다 연결을 끊는다.
- 그렇다면 이전 사용자를 식별하기 위해서 어떤 방법을 사용해야 할까?
- Token, Session 방법이 있겠다.
- 요즘은 Token 방식을 많이 활용한다.
Session에 대한 이해
- 브라우저 쿠키에 Session을 저장하지만, 실질적으로 저장되어 있는 곳은 서버의 메모리이다.
- 클라이언트마다 Session이 생성된다면 트래픽 당 메모리 소요가 생긴다.
- 즉, 트래픽이 많아질수록 서버 메모리의 부하가 심해진다.
- WAS가 2개 이상 운영되는 서비스에선 동일한 Session을 다른 WAS에서도 동일하게 식별하기 위해 세션 클러스터링 설정 혹은 별도의 Storage를 운영해야 한다.
- Session을 서버에서 관리하기 때문에 보안에 좀 더 유리하다.
- 해커에게 Session을 탈취 당하더라도 서버 쪽에서 Session을 무력화(invalid) 시키면 된다.
Token에 대한 이해
- 서버 쪽에서 클라이언트의 정보를 가지고 있지 않는다.
- HTTP 프로토콜의 비연결성, 무상태성의 특징을 동일하게 가지고 있다.
- Session보다 보안에 취약하다.
- Token 탈취 등의 보안 상황을 고려해야 한다.
Tomcat의 Session ID 생성 메커니즘
- 브라우저의 최초 접근 시 톰캣은 SESSION ID를 브라우저 쿠키에 저장하고, Tomcat 서버 메모리 상에 Session 정보를 등록한다.
- 그렇다면 무수히 많은 사용자가 있는 서비스라는 가정 하에, Session은 어떻게 사용자를 식별할까?
- Session ID가 생성되는 메커니즘
- 요청 시 Session ID를 생성한다.
- StandardSessionIdGenerator를 통해 JSESSION ID를 생성한다.
- Session ID는 바이트 난수, jvmRoute(사용자의 노드 식별값)로 구성된다.
- 암호화 알고리즘을 지정하지 않으면 SHA1PRNG가 사용된다.
setSecureRandomAlgorithm
public void setSecureRandomAlgorithm(java.lang.String secureRandomAlgorithm)
Specify a non-default algorithm to use to create instances of SecureRandom which are used to generate session IDs. If no algorithm is specified, SHA1PRNG will be used. If SHA1PRNG is not available, the platform default will be used. To use the platform default (which may be SHA1PRNG), specify null or the empty string. If an invalid algorithm and/or provider is specified the SecureRandom instances will be created using the defaults for this SessionIdGenerator implementation. If that fails, the SecureRandom instances will be created using platform defaults.
- SHA1PRNG가 사용된 것을 알 수 있다.
- StandardSessionIdGenerator의 Attribute
- jvmRoute: Session ID 뒤에 붙을 Tomcat instance와 연결된 노드의 식별값, ‘.’로 구분한다.
- Session ID: 암호화 알고리즘으로 생성된 랜덤 16진수 난수
- SessionId Length: SessionID + jvmRoute를 담을 수 있는 공간의 크기
Session 주요 Properties
- attribute: setAttribute()를 통해 설정한 속성 값들, ConcurrentHashMap은 HashMap의 동기화 문제를 보완했다.
- creationTime: Session을 생성한 시간
- isNew: Session 최초 생성 검증, JSP를 사용하는 경우 alway false를 리턴한다.
- maxInactiveInterval: Servlet Container가 Session을 유지하는 시간
- 그 외
- manager: Session Pool을 관리하는 클래스, 별도의 저장 공간을 지정하는 등의 기능을 제공한다.
- LifeCycle: Tomcat Catalina의 LifeCycle 관리
- Sessions.ser: 서버에 명시적으로 저장된 Session, Tomcat Catalina를 재시작해도 해당 파일에 기재된 Session은 다시 서버에 저장한다. Manager의 doLoad()를 통해 동작한다.
정리
- Tomcat Session은 jvmRoute로 사용자를 식별한다.
- Session에 관한 설정들은 Property에 접근해서 설정할 수 있다.
- 별도의 Session Storage에서 관리할 수 있다.
- Redis와 같은 비관계형 데이터베이스를 이용해서 Session을 Key-Value로 관리할 수도 있다.
Reference
https://hudi.blog/session-based-auth-vs-token-based-auth/
https://tomcat.apache.org/
https://tecoble.techcourse.co.kr/post/2021-11-26-hashmap-hashtable-concurrenthashmap/
https://www.waitingforcode.com/tomcat/session-storage-in-tomcat/read
'Infra' 카테고리의 다른 글
[jenkins] 신입의 객기 - 자동화 여정 (End) (0) | 2023.04.27 |
---|---|
[jenkins] 신입의 객기 - 자동화 여정 (2) (0) | 2023.03.20 |
[jenkins] 신입의 객기 - 자동화 여정 (1) (0) | 2023.03.13 |