우선 HTTP에 대해 짚고 넘어간다.
특징:
- 클라이언트 서버 구조
- 무상태 프로토콜(Stateless)
- 비 연결성(Connectionless)
무상태
정의: 서버가 클라이언트의 상태를 가지고 있지 않는 것이다.
장점: 비용(리소스)를 줄임, 서버의 확장성에 용이( 응답 서버를 쉽게 바꿀 수 있기 때문에 무한한 서버 증설이 가능)
단점: 모든 정보를 각 서버에게 전달해야하기 때문에 요청이 복잡해진다.
비연결성
정의: 클라이언트와 서버거 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어버리는 성질
장점: 연결을 유지하기 위한 리소스를 줄이면 더 많은 연결을 할 수 있다.
단점: 동일한 클라이언트의 모든 요청에 대해, 매번 새로운 연결을 시도/해제의 과정을 거쳐야하므로 연결/해제에 대한 오버헤드가 발생한다.
쿠키(Cookie)
정의:
HTTP의 일종으로 사용자가 어떠한 웹 사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버에서 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일이다. HTTP에서 클라이언트의 상태 정보를 클라이언트의 PC에 저장하였다가 필요시 정보를 참조하거나 재사용할 수 있다.
특징:
- 쿠키는 클라이언트 로컬에 저장되는 key-value 형태의 데이터이다. (이름, 값, 만료일(저장기간), 경로 정보)
- 클라이언트 로컬에 저장되기 때문에 상대적으로 변조가 쉽다.
- 클라이언트의 상태 정보를 로컬에 저장했다가 request할 때 참조된다.
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키는 4KB까지 저장 가능하다.
- 크롬 개발자 도구(F12) 기준 Application → Storage → Cookies에서 볼 수 있다.
동작방식:
문제점:
쿠키 탈취시 key가 중요한 정보(ex) 주민정보)라면 문제가 된다. 따라서 Session을 사용한다.
세션(Session)
정의:
세션은 쿠키를 기반하고있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리한다.
세션은 비밀번호같은 인증정보를 쿠키에 저장하지 않고 사용자의 식별자인 JSESSIONID(session ID)로 저장한다.
쿠키보다 보안이 좋지만, 사용자가 많아질수록 서버메모리를 많이 차지하여 동접자가 많은 경우 서버에 과부하를 주어 성능저하를 초래할 수 있다.
동작방식:
쿠키와 세션을 이용한 로그인
JWT(JSON Web Token)
: 인증에 필요한 정보들을 Token에 담아 암호회시켜 사용하는 토큰이다. 따라서 사실 기본적인 인증을 진행하는 구조는 Cookie때와 크게 다르지 않다. 다만, JWT는 서명된 토큰이다. 공개/개인 키를 쌍으로 사용하여 토큰에 서명할 경우 서명된 토큰은 개인 키를 보유한 서버가 이 서명된 토큰이 정상적인 토큰인지 인증할 수 있다.
JWT 구성요소
- Header
- Payload
- Signature
1. Header
: 알고리즘 및 토큰 타입 기재
2. Payload
: 실 데이터가 있는 부분, 어떤 Claim값을 넣을지는 개발자의 마음이다.
iss(issuer): 토큰 발급자
sub(Subject): 토큰 제목 - 토큰에서 사용자에 대한 식별값이 됨
aud(Audience): 토큰 대상자
exp(Expiration Time): 토큰 만료 시간
nbf(Not Before): 토큰 활성 날짜 (이 날짜 이전의 토큰은 활성화되지 않음을 보장한다)
iat(Issued At): 토큰 발급 시간
jti(JWT Id): JWT 토큰 식별자(issuer가 여러명일 때 이를 구분함)
3. Signature
: 토큰을 인코딩 및 유효성 검증을 할 때 사용하는 고유 시그니처 암호화 코드
동작방식:
JWT 뜯어보기 - SpringBoot (눈에 보기 쉽게 ppt로 정리한 것 첨부)
1. 토큰 생성
2. 토큰 검증
Session vs JWT
Session | JWT | |
장점 | - 서버에서 Session 통제 가능 - 네트워크의 부하가 낮다 |
- 인증을 위한 별도의 저장소가 필요없다. - 빠른 인증 처리 - 확장성 측면에서 좋음 |
단점 | 세션 저장소 사용으로 인한 서버의 부하 | - 토큰의 길이가 길어 네트워크 부하가 증가 - 특정 토큰을 강제로 만료시키기 어렵다. |
Q. 왜 JWT가 확장성이 좋을까?
A. 세션 방식은 모든 서버가 세션값을 공유하기 위해서 DB에 저장하거나 메모리 서버를 구축해야한다. 하지만 JWT는 토큰 자체만으로 유효성을 검증할 수 있으므로 확장성이 좋다.
Q. Access Token을 도난당하면?
A. 훔친 토큰을 가지고 요청을 보내는 경우에 서버는 이 토큰값을 무효화시킬 수 있는 방법이 없다.
→ Refresh Token 등장
→ Access Token의 유효시간을 매우 짧게하여 Token 도난시 그 토큰으로인한 피해시간을 줄인다.
Q. Refresh 토큰이 뚫린다면?
A. 그런 일이 없도록 Refresh 토큰의 보안벽을 이중, 삼중으로 만든다.
→ 다른 방식으로는 Access 토큰을 발급 받을 때 Refresh 토큰도 새로 발급받는 것도 있다.
참고자료
[Network] HTTP의 특징에 대해 알아보기(feat. 비연결성, 무상태) (tistory.com)쿠키, 세션의 특징과 사용하는 이유 (tistory.com)
[8장] 2. 확장성(Scalability) (nulls.co.kr)
[Network] HTTP의 특징에 대해 알아보기(feat. 비연결성, 무상태) (tistory.com)
JWT(Json Web Token) 알아가기 (brunch.co.kr)
JWT 뿌시기 (세션방식과 비교/정의/구조/검증방법/장단점) (feat.Refresh 토큰) (tistory.com)
'이론' 카테고리의 다른 글
2024-07-30 (0) | 2024.07.30 |
---|---|
2024-07-29 (0) | 2024.07.29 |
DB 발전 과정 (1) | 2023.11.14 |
싱글톤(singleton) 패턴 (0) | 2023.11.09 |
스프링(Spring)이란? (0) | 2023.11.09 |