session

1. 세션 ID를 서버에서 클라이언트가 다시 웹사이트에 접속시 발급해준다
2. 서버에서 클라이언트로 발급해준 세션 ID를 쿠키를 사용해서 저장한다
3. 클라이언트는 다시 접속시 이 쿠키를 이용해서 세션 ID값을 서버에 전달한다
(클라이언트의 브라우저에 세션의 ID만 쿠키에 저장하게한다)
세션의 장점
- 각 클라이언트에게 고유 ID를 부여함
- 세션ID로 클라이언트를 구분해서 클라이언트의 요구에 맞는 서비스를 제공함
- 사용했던 정보들을 서버에 저장하기 때문에 보안면에서 쿠키보다 우수함
세션의 단점
- 서버에 저장되는 세션 때문에 서버에 처리를 요구하는 부하와 저장공간이 필요로 한다
- 확장시 모든 서버가 접근할 수 있도록 별도의 중앙 세션 관리 시스템이 필요하다
- 확장성이 좋지 않다(여러대의 서버 컴퓨터를 추가할 경우)
- CORS : 웹 어플리케이션에서 세션을 관리할 때 자주 사용되는 쿠키는 단일 도메인 및 서브 도메인에서만 작동하도록 설계되어 있다. 따라서 쿠키를 여러 도메인에서 관리하는것은 번거롭다
JWT(JSON Web Token
- 토큰 기반 인증방식으로 클라이언트의 세션 상태를 저장하는 게 아니라 필요한 정보를 토큰 body에 저장해 클라이언트가 가지고 있고 그것을 증명서처럼 사용한다
- OAuth를 이용하면 아이디를 카카오 네이버처럼 다른 사이트에서 이용할 수 있음
- 웹서버에서 토큰을 서버에서 전달할때에는 HTTP요청의 헤더 등에 토큰값을 포함시켜서 전달함
- JWT 구조

JWT는 헤더(header), 정보(payload), 서명(signature) 구조로 이루어져 있다.
| header | 타입(JWT)과 알고리즘(BASE64같은)을 담는다. |
| payload | 보통 유저 정보(id같은)와 만료기간을 담는다. |
| signature | header, payload를 인코딩 한 값을 합친 뒤 SECRET_KEY로 해쉬한다. |
- 토큰 기반 시스템의 작동원리

- 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청합니다.
- 서버는 사용자로 부터 받은 ID, PW를 확인한 후 secret key를 통해서 Access Token(JWT)과 Refresh Token을 발급합니다.
- JWT가 요구되는 API를 요청할 때(나의 주문 내역 확인 등등..) 클라이언트가 Authorization header에 Access Token을 담아서 보냅니다.
- 서버는 JWT Signature를 체크하여 중간에 위변조 되었는지 확인합니다. 이상이 없으면 Payload로 부터 사용자의 정보를 확인해 요청에 맞는 정보를 응답합니다.
- 액세스 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 새로운 엑세스 토큰을 발급 받습니다.
- 토큰의 장점
- 확장성(서버)
- 토큰에 선택적인 권한만 부여하여 발급할 수 있다 (소셜계정을 이용해서 다른 웹서비스에 로그인)
- 쿠키 사용으로써 발생하는 취약점이 사라짐
- CORS 문제를 간단히 해결함
Access-Control-Allow-Origin: *
- 토큰의 단점
- 데이터 증가에 따른 네트워크 부하 증가
- self-contained - JWT가 만료시간 전에 탈취당하면 서버에서 할수있는것이 없다
- Payload 인코딩 - 페이로드는 Base64로 인코딩된것이기 때문에 중간에 탈취하여 디코딩할 경우 데이터를 볼 수있다
- Stateless - 상태를 저장하는것이 아니기 때문에 한번 만들어지면 제어가 불가능
- 토큰을 임의로 삭제하는 것이 불가능하므로 만료 시간을 꼭 넣어주어야 함
- xss 보안공격을 방지하려면 jwt에 민감한 정보를 포함하지 않아야함
- JWT와 보안
공격자에 의해서 토큰이 하이재킹 당할 수 있다. JWT를 보호하기 위한 HTTP헤더 플래그를 설정해야한다.
| Secure 쿠키 | HTTPS 프로토콜을 통한 암호 요청만을 통해서 전송할 수 있다 |
| SameSite(신규플래그) |
|
| Prefix |
|
| HTTPOnly | 본 플래그를 설정하면 자바스크립트의 Document.cookie API를 통한 접근이 불가능함. 오직 서버로만 전송됨 |
참고 사이트
https://gompro.postype.com/post/1330799
https://covenant.tistory.com/201
'Web' 카테고리의 다른 글
| [web] CORS, XSS, CSRF란? (0) | 2022.02.09 |
|---|