ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기억해줘! 기억할게! (쿠키, 세션, 토큰)
    개발 지식/WEB 2023. 11. 28. 23:25

    HTTP는 stateless, 상태를 저장하지 않습니다.

    HTTP를 사용하는 서버는 우리가 요청을 여러 번 보내도 우리를 기억해주지 않습니다.

    이 매정한 녀석에게 우리를 기억하게 하려면 어떻게 해야 할까요?

    쿠키 (Cookie)

    서버는 매정하지만 달콤한 것을 좋아한다는 이야기가 있습니다.

    그리고 우리는 그 점을 이용하여 서버가 우리를 기억할 수 있게 쿠키를 이용할 것입니다.

    행운의 메시지를 담은 과자인 포춘 쿠키에서 유래한 쿠키(cookie)는 마찬가지로 사용자 정보를 가지고 있는 작은 데이터 조각입니다.

    사용자가 서버로 요청을 보내면 쿠키도 함께 보내지며 가지고 있는 정보를 전달하는 매개체 역할을 합니다.

    그렇다면 쿠키는 무슨 정보를 가지고 있길래 사용자가 누구인지 알 수 있는 걸까요?

    세션 (Session)

    사용자가 로그인하기 위해 ID와 비밀번호를 보내면, 서버는 이를 확인하고 세션 DB에 새로운 사용자를 생성합니다.

    해당 세션에는 별도의 세션 ID가 있는데, 이 세션 ID를 쿠키에 저장한 뒤 응답과 함께 브라우저에 보내줍니다.

    이후에 브라우저가 서버에 새로운 요청과 함께 쿠키를 보내면 서버는 쿠키에 있는 세션 ID를 확인하게 됩니다.

    이 세션 ID로 서버는 세션 DB를 탐색하여 사용자가 누구인지 알 수 있게 되는 겁니다.

    중요한 정보는 서버가 가지고 있고, 사용자는 세션 ID만 가지고 있는데도 인증을 할 수 있게 되었습니다!

    토큰 (Token)

    그럼 토큰은 언제 사용하는 걸까요?

    토큰은 입장권과 비슷한 역할을 합니다. 

    입장권을 주면 그 입장권을 확인하고 신원을 확인하여 들여보내주는 것과 비슷한 역할을 합니다.

    토큰은 이상하게 생긴 string입니다.

    이 문자열을 확인하고, 서버는 사용자를 확인할 수 있는 것입니다.

    그리고 웹 보안에서 흔히 말하는 토큰은 아래의 JWT를 말하는 것입니다.

    JWT (Jason Web Token)

    JWT는 Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 웹 토큰을 말합니다.

    JWT는 Header, Payload, Signature로 이루어져 있습니다.

    헤더(Header)는 토큰의 유형과 서명 암호화 알고리즘 정보를 포함하고 있습니다.

    페이로드(Payload)는 실제로 사용될 정보에 관한 내용입니다.

    마지막 서명(Signature)은 헤더에서 정의한 알고리즘으로 헤더와 페이로드를 인코딩합니다.

    JWT는 이 세 부분을 Base64로 인코딩한 하나의 문자열입니다.

    이제 사용자가 요청과 함께 해당 토큰을 보내면 서버는 서명이 유효한지 확인함으로써 인증을 할 수 있습니다.

    https://jwt.io

    하지만, JWT는 말 그대로 서명 자체가 목적입니다.

    JWT는 Base64로 인코딩을 하므로 디버거를 사용하면 쉽게 복호화가 가능합니다.

    그러면 사용자의 데이터를 담은 페이로드가 그대로 노출되기 쉽습니다.

    토큰의 사용 목적은 정보 보안이 아닌 위조 방지이기 때문에 중요한 정보를 토큰에 담아서는 안 됩니다.

    세션, 토큰 기반 인증 방식 비교

    앞서 말한 쿠키와 세션을 이용한 인증 방식을 세션 기반 인증 방식, JWT를 이용한 인증 방식을 토큰 기반 인증 방식이라고 합니다.

    두 인증 방식의 장단점을 잘 파악하여 어떤 방식을 사용할지 상황에 맞게 정해야 합니다.

    세션 기반 인증 방식 장단점

    장점

    • 정보가 서버 측에 저장되므로 클라이언트가 실제 데이터에 접근하기 어려우므로 보안이 좋습니다.
    • 마찬가지로 서버 측에 정보가 저장되므로 여러 기능을 제공할 수 있습니다. (로그아웃 등)

    단점

    • 세션은 서버에서 관리되기 때문에 서버 부하가 증가할 수 있습니다.
    • 서버가 세션 상태를 유지하기 때문에 서버에 대한 요청이 필요하며 상태를 저장하고 검색하는데 추가적인 자원이 필요합니다.

    토큰 기반 인증 방식 장단점

    장점

    • JWT는 클라이언트에 저장되므로 서버에 부담을 주지 않습니다.
    • 토큰을 사용하면 여러 도메인 간에 인증을 쉽게 공유할 수 있습니다.

    단점

    • JWT는 브라우저에 그대로 노출되어 있으므로 보안이 좋지 않습니다.

    후기

    사실 지금까지는 쿠키와 세션, 토큰을 사용해 서버가 사용자를 기억할 수 있게 한다고는 알고 있었습니다.

    하지만, 어떻게 사용자를 기억할 수 있는지는 자세하게 몰랐었습니다.

    이번에 학습하면서 어떤 내용이 있기에 사용자를 기억할 수 있는지 알게 되었고, 보안을 신경 쓰기 위해 무작정 사용자 정보를 넣으면 안 된다는 것도 알게 되었습니다.

    앞으로는 오늘 배운 것들을 통해 웹 보안과 사용자 경험을 좀 더 향샹 시킬 수 있을 거라 생각합니다.

    참고

    https://dzone.com/articles/cookies-vs-tokens-the-definitive-guide

    https://jwt.io/introduction

    https://velopert.com/2350#google_vignette

    '개발 지식 > WEB' 카테고리의 다른 글

    웹 접근성과 웹 표준을 알아보자!  (0) 2024.05.22
Designed by Tistory.