난 코더인가,,,,개발자인가...........................................난 그냥 말도 못하는 감자나부랭..........
HTTP
- HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜이다.
- 웹에서 이루어지는 모든 데이터 교환의 기초
- 클라이언트 -> 서버 : Requests(요청)
- 서버 -> 클라이언트 : Responses(응답)
- HTTP는 상태는 없지만 세션은 있다...
HTTP는 상태를 저장하지 않는다. 즉 무상태인것
HTTP는 요청을 처리한 후 연결을 끊어버린다. 그렇기 때문에 서버에서 클라이언트의 상태 정보와 통신 상태가 남아있지않다.
서버가 사용자의 로그인 상태를 알기 위해 사용하는 것 3가지 쿠키, 세션, 토큰
1. 쿠키(Cookie)
쿠키는 사이트의 서버를 통해서 쿠키를 전송하여 클라이언트에서 정보를 저장하고 관리한다.
- 서버에서 HTTP Response Header에 Set-Cookie 속성을 사용해서 클라이언트측의 Cookie를 저장하고 다음 요청부터 요청과 함께 Cookie값을 전달해서 이전의 통신에서 사용된 정보들을 파악한다.
- 문제점 1: 쿠키 값을 그대로 보내기 때문에 보안에 취약하다.
- 문제점 2: 쿠키에 용량제한이 있어 많은 정보를 담을 수 없다.
- 문제점 3: 브라우저마다 쿠키 형태가 달라 브라우저간 공유가 불가하다.
2. 세션(Session)
세션은 클라이언트에 정보를 저장하지 않고 서버를 통해서 정보를 관리한다.
- 클라이언트가 웹페이지에 접속한 시점부터 웹페이지와 연결을 끝내는 시점동안 들어오는 요청을 하나의 상태로 생각한다.
- 서버는 세션에 정보를 저장하고 클라이언트에게 이 세션을 구분할 수 있는 ID를 부여한다 -> Session ID(보안 강화)
- 이 Session ID가 브라우저의 쿠키에 저장되고 다음 요청부터 쿠키에 저장된 SessionID를 보내고 이를 통해 서버는 정보를 확인한다.
- 문제점 1: 서버에 장애가 생겨 다른 서버를 사용하게 되면 옮긴 서버에 상태값들이 없기 때문에 문제가 발생한다.
- 문제점 2: 서버에서 세션 저장소를 만들어서 관리하기 때문에 안전하지만 유저가 많아질수록 서버에 부하가 발생한다.
- 문제점 3: 세션ID를 탈취하여 공격자가 해당 세션ID의 사용자인 척 하면 서버는 이를 구별할 수 없다.
3. 토큰(Token)
토큰은 서버에서 클라이언트의 정보를 담은 Token을 발급하고 클라이언트측에 저장하여 관리한다.
- 서버에서 클라이언트의 정보를 담은 Token을 발급하고 클라이언트측에 저장하고 요청시에 헤더에 담아서 서버에 인증을 시도한다.
- 클라이언트측에서 저장하고 관리하기 때문에 서버에 부담을 주지 않는다
- 문제점 1: 토큰을 탈취당하면 대처가 어렵다.
그럼 로그인을 구현할 때 가장 많이 사용하는 JWT에 대해 알아보자..
JWT
JWT의 구조는 헤더, 페이로드, 시그니처로 구성되어있다.
- 헤더 : JWT에서 사용할 타입과 사용자의 정보를 암호화한 해시 알고리즘의 정보가 들어있다.
- 페이로드 : 사용자의 정보와 권한 정보가 담겨있다.
- 시그니처 : 헤더와 페이로드를 Base64 URL-sage Encode 하고 헤더에 저장된 해시함수를 적용하고, 개인키로 서명한 전자서명이 담겨있다.
-> jwt값은 jwt.io에서 특별한 암호화 없이 흔히 사용하는 base64인코딩을 사용하기 때문에 서버가 아니더라도 그 값들을 확인할 수 있다.
JWT인증과정은 나눠서 정리하겠음(이름이 비슷해서 헷갈려...)
HS256
1. 서버에서 헤더, 페이로드값이 Base64로 인코딩된다(jwt.io를 통해 복호화되는 것을 알 수 있음)
2. 서명(Signature)은 헤더+페이로드+secret값을 HS 256알고리즘으로 암호화
3. 클라이언트에 저장후 요청에 jwt담아서 요청
4. Header와 Payload를 Base64알고리즘으로 복호화한다. 이 후 서버만 알고있는 개인키를 가지고 다시 HS256알고리즘을 이용해 암호화하고 그 값이 클라이언트에서 보낸 토큰과 같은지 유효성 검증을 한다.
RS256
1. 서버에서 헤더, 페이로드값이 Base64로 인코딩된다(jwt.io를 통해 복호화되는 것을 알 수 있음)
2. 서명(Signature)은 헤더+페이로드값을 서버의 개인키로 암호화한다.
3. 클라이언트에 저장후 요청에 jwt담아서 요청
4. 서버에서 jwt를 받고 공개키로 서명을 복호화해서 비교한다.
*비대칭키 암호화 알고리즘
- 공개키로 암호화한 것은 개인키로 복호화 가능
- 개인키로 암호화한 것은 공개키로 복호화 가능
'[ STUDY ] > 끄적끄적..' 카테고리의 다른 글
[ 알아보자 ] HTTP통신을 할 때 어떤식으로 서버에 데이터를 요청하나... (10) | 2024.10.17 |
---|---|
[ 알아보자 ] Spring Security 다시 알아보자.... (0) | 2024.10.16 |
[ 알아보자 ] WEB과 WAS (0) | 2024.10.16 |
[ 알아보자 ] React랑 Node.js(?) (0) | 2024.09.24 |
[Flutter] Dart언어 (0) | 2023.03.20 |