Cookie란?
- Cookie는 서버가 사용자 웹 브라우저에 전송하는 작은 데이터 조각입니다. 웹 브라우저는 서버로부터 받은 데이터 조각들을 저장해 놓았다가 서버에 요청할 때 Cookie에 저장된 데이터를 같이 전송합니다.
Cookie 사용 목적
- Session을 발급하고 Cookie에 Session ID를 담아 클라이언트에 전송함으로써 로그인 상태를 유지할 수 있습니다.
- 사용자만의 셋팅 값 또는 테마 등의 데이터를 저장할 수 있습니다.
- 쿠키에 담긴 사용자의 인터넷 사용기록을 이용하여 맞춤 광고를 제공할 수 있습니다.
Set-Cookie와 Cookie 헤더
- 서버는 HTTP 요청에 대한 응답을 할 때 Set-Cookie 헤더를 이용해서 Cookie에 저장할 데이터를 전송할 수 있습니다.
- 웹 브라우저는 서버에 요청할 때 Cookie 헤더를 이용해서 Cookie에 저장된 데이터를 요청에 담을 수 있습니다.
Cookie 속성
- Domain과 Path는 Cookie가 사용될 수 있는 Domain과 Path를 의미합니다.
- Secure는 HTTPS를 사용하는 경우에만 Cookie를 사용할 수 있습니다.
- HttpOnly는 XSS 공격을 방지하기 위해 JavaScript와 Document.Cookie API로 접근할 수 없게 하는 속성입니다.
Cookie의 종류
- Session Cookie는 메모리에만 저장되며 브라우저 종료 시 삭제합니다.
- Persistent Cookie는 디스크에 저장하여 브라우저가 종료되어도 유지되는 Cookie입니다. 주로 Session ID를 저장할 때 사용합니다.
- Secure Cookie는 HTTPS로 통신할 경우에만 사용하는 Cookie입니다.
- Third-Party Cookie는 방문한 도메인과 다른 도메인의 쿠키로서 주로 맞춤 광고에 사용되는 쿠키입니다.
Cookie의 단점
- 요청 시 쿠키의 값을 그대로 보내기 때문에 유출 및 조작 당할 위험이 존재합니다.
- 4KB의 용량 제한이 있습니다.
- 웹 브라우저 마다 지원 형태가 다르며 브라우저간의 공유가 불가능합니다.
- 쿠키의 사이즈가 커질수록 네트워크의 부하가 상승합니다.
Session
- 세션이란 상호 연결 상태 정보를 공유함으로써 가상의 연결 상태를 구현하는 기법입니다.
- 웹 에서는 사용자가 로그인했을 때 Session을 발급하고 SessionID를 Set-Cookie 헤더를 이용해 클라이언트에게 공유하여 Session을 유지합니다.
- Session은 사용자의 요청이 있을 때마다 SessionID로 DB에서 Session을 조회해야 하는 추가적인 작업이 필요하다는 단점이 있습니다.
Session 방식의 단점
- 사용자의 Session ID를 탈취하여 서버에 접속할 수 있습니다.( 이를 위해서는 IP 제한 또는 접속 기기 제한을 이용해 추가적인 보안이 필요합니다. )
- 요청마다 SessionID로 DB에 저장된 Session을 조회해야 하기 때문에 DB 서버의 부하가 상승합니다.
토큰 인증 방식
- Token 기반 인증 시스템은 사용자가 로그인하였을 때 서버가 클라이언트에게 세션 정보가 담긴 토큰을 부여하고, 클라이언트의 매 요청마다 서버는 토큰이 유효한지만 검사하는 인증 기술입니다. Session에 대한 정보를 서버에서 관리하지 않기 때문에 Session 데이터 조회로 인한 서버의 부하를 없앨 수 있습니다.
Token 방식의 단점
- 쿠키/세션과 다르게 토큰 자체의 데이터 길이가 길어, 인증 요청이 많아질수록 네트워크 트래픽이 증가합니다.
- Payload 자체는 암호화되지 않기 때문에 유저의 중요 정보는 담을 수 없습니다.
- 토큰을 탈취당하면 대처하기 어렵습니다. 그렇기 때문에 필수적으로 사용 기간 제한을 설정해야 합니다.
JWT( JSON Web Token )
- JWT(JSON Web Token)란 토큰 인증 방식에 사용되며, 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미합니다.
JWT 구조
- JWT는 Base64 URL-safe로 인코딩 되어있으며 '.' 을 구분자로 3 가지의 문자열인 Header, Payload, Signature로 구분됩니다.
- Header에는 서명 암호화 알고리즘과 토큰 유형이 담겨져있습니다.
- Payload에는 발행자, 만료 시간 등의 클라이언트 Session에 대한 정보가 담겨져 있습니다.
- Signature에는 Base64Url(Header) + . + Base64Url(Payload) + server's key에다가 Header에 있는 알고리즘 방식으로 암호화한 결과값이 저장되어 있습니다. server's key는 오직 서버만 알고있기 때문에 Signature를 통해서 해당 Token이 조작되었는지 여부를 확인할 수 있습니다.
JWT 장점
- 서버가 Session에 대한 별도의 저장 공간을 사용할 필요가 없습니다.
- 서버와 클라이언트간의 완전한 Stateless 구조를 갖기 때문에 확장성이 우수합니다.
- 모바일 어플리케이션과 호환성이 좋습니다.
JWT 단점
- Payload에 중요한 데이터를 담지 않도록 주의해야 합니다.
- 토큰의 크기 때문에 네트워크 트래픽이 증가할 수 있습니다.
- 토큰 자체가 탈취 당할 수 있기 때문에 토큰에 대한 유효기간을 지정해야 합니다.
Refresh Token
- JWT만을 사용할 경우 헤커가 사용자의 JWT를 탈취할 수 있습니다. 그렇기 때문에 Access Token과 Refresh Token 두개를 발급하여 실제 인증에 사용되는 Access Token의 유효기간을 짧게하고 만약, 만료되었다면 Refresh Token을 이용해서 재발급 받을 수 있도록 합니다. Refresh Token 또한 탈취 당할 수 있기 때문에 Access Token을 새로 발급 받을 때마다 새로운 Refresh Token을 발급하여 Refresh Token을 갱신시키는 방법을 주로 사용합니다. 이를 Refresh Token Rotation( RTR ) 이라 합니다.
- Refresh Token을 서버쪽에서 관리하여 사용자의 JWT를 갱신시켜주는 방법도 있습니다. 어떻게 본다면 Refresh Token을 서버에서 관리하는 것은 결국 서버에서 Session을 관리하는 단점과 동일하게 볼 수도 있습니다. 하지만, 서비스가 커짐에 따라서 필요한 사용자 정보가 커지지만 Refresh Token은 그대로이기 때문에 Session을 직접 관리하는 것보다는 훨씬 서버에 부하가 적습니다.
JWT vs Cookie & Session
장점 | 단점 | |
---|---|---|
Cookie & Session | 서버에서만 Session에 대한 정보를 관리할 수 있고 네트워크 부하 낮음 | 세션 저장소 사용으로 인한 DB 서버 부하가 큼 |
JWT | 서버에서 인증을 위해 별도의 Session 저장소가 필요없으며 완전한 Stateless 구조로 확장성이 우수 | 토큰이 클 수록 네트워크 트래픽이 증가 |
'네트워크 > HTTP' 카테고리의 다른 글
Web Server와 WAS(Web Application Server)의 차이점 (0) | 2023.02.26 |
---|---|
SOP( Same-Origin Policy )와 CORS( Cross-Origin Resource Sharing )이란? 그리고 해결방법 (0) | 2023.02.07 |
HTTP 헤더의 종류와 사용법 (0) | 2023.01.30 |
HTTP 상태코드란? (0) | 2023.01.29 |
HTTP API 설계 방법과 HTTP 메서드와 특징 (1) | 2023.01.29 |