https://github.com/lhoju0158

개발 끄적끄적

[Spring] Security - 웹 보안 이해

lhoju0158 2025. 8. 3. 14:02

1. JWT를 이해하기전 세션에 대해 알아보자

JWT: JSON Web Token 

 

왜 사용되고 어떻게 쓰이는가!

 

user가 web 브라우저에 www.naver.com 이라 친다. 이후 엔터를 누르면 GET 요청이 들어간다.

 

그러면 서버는 controller에서 해당 주소에 맞는 method를 찾는다. 메서드에서 요청에 맞는 html 파일을 return해준다. 이때 http 헤더를 단다. 헤더엔 쿠키가 존재하고 세션id가 할당된다. web 브라우저 쿠키 영역에 세션 id를 저장한다. 최초 요청 시 생성되고, 이후 요청 시 쿠키에 세션 id를 달고 간다. 여기서 세션 id의 역할 -> 이전 방문 정보 저장

 

 그럼 언제 소멸되는가

1. 서버에서 세션 값을 날리는 경우

2. 사용자가 브라우저를 닫는 경우 (종료)

3. 특정 시간이 지나면 사라짐 (보통 30분)

 

보통 로그인 시 인증을 위해서 사용된다. 로그인 요청 시 서버의 세션 저장소에는 세션 ID가 저장된다 (세션 저장소는 다른 사용자 요청다 받기에 크기가 상당하다) 또한 세션 ID마다 다른 저장소가 할당된다. 

 

세션 연결 후 로그인 요청을 하면 세션 ID에 알맞는 저장소에 클라이언트의 user 정보를 저장한다. 로그인이 성공하면 .html 파일 (보통 메인페이지)를 return해준다. 이후 client가 유저 정보를 요청하면 세션 id에 맞게 응답한다.

 

그럼 세션의 단점은 뭔가?

 

클라이언트와 서버가 소통할 때 만일 동시접속을 1000명이 한다고 하자. 근데 우리 서버는 100명만 사용 가능하다. 그러면 서버를 여러개 만들어서 부하를 방지한다. => 이걸 로드 밸런싱이라 한다. 여기서 서버 1, 2, 3이 있다 가정하자.

 

클라이언트가 초기 세션 연결시에는 #1에 요청을 했다. 이후 로그인 요청을 했는데 해당 요청은 #2로 갔다고 하자. #2의 입장에서는 세션 저장소에 client 세션 관련 정보가 없으므로 로그인을 할 수 없다.

 

이걸 방지하기 위해서 스티킹 서버를 만든다. 최초 요청 client에 대한 처리를 단일 서버에서 맡는다. 

혹은 세션 저장소를 모든 서버에 복제시킨다. 

혹은 단일의 DB에 session값을 넣고 모든 서버가 DB에 접근해서 세션 정보를 확인한다. DB를 공유한다. 이럴 경우 I/O가 일어난다. 메모리에 저장된게 아니라서. 그러면 매우매우 오래 걸린다.

그래서 보통 메모리 공유 서버를 사용한다. I/O가 일어나지 않기때문이다. 대표적으로 redis가 있다. 

 

2. JWT를 이해하기 전에 배경지식 (TCP, CIA, RSA, RFC)

UDP의 경우는 신뢰성, 순서를 보장하지 않는다. 전화, 동영상 전송에 주로 사용된다. 왜냐? 사람이 받으니깐 데이터 손실이 있어요 전체 데이터에 대한 이해가 가능함.

 

그러나 비밀번호, 인증의 경우 신뢰도가 중요하다. 따라서 UDP가 아닌 TCP를 통해 소통한다.

 

보내는 데이터는 CIA를 보장해줘야 한다. 

- C (Confidentiality)

데이터 암호화 -> 승인되지 않은 사용자로부터 정보를 보호한다

- I (Integrity)

디지털 서명 -> 전송 중 데이터가 변경되지 않았음을 확인한다

- A (Availability)

백업 시스템, 이중화 -> 항상 접근 가능하도록 보장한다. 

 

암호화 방식 중 RSA가 있음. 공개키 기반 암호화 방식임.

 

A와 B가 소통한다면,

A는 B의 공개키로 암호화해서 데이터를 전달하고, B는 자신의 개인키로 복호화한다. (데이터 암호화)

A는 자신의 개인키로 암호화해서 데이터를 전달하고, B는 A의 공개키로 복호하한다. (디지털 서명)

 

RFC: 통신을 위해 만든 문서, 프로토콜