티스토리 뷰

CS

쿠키와 세션 vs 토큰과 JWT

lemonade99 2023. 5. 31. 19:19

프로젝트를 진행하던 도중 JWT를 이용해 로그인 기능을 구현하였다. 막상 JWT와 같이 거론되는 쿠키,세션에 대해서도  제대로 정리가 되지 않았다. 이 기회에 쿠키,세션,토큰,JWT에 대해 정리해보려한다.

 

쿠키와 세션,JWT를 사용하는 데에는 HTTP의 특징인 connectionless와 stateless의 성질을 갖고있기 때문이다. 

connectionless(비연결성) 란 서버가 연결을 맺은 후 , 클라이언트 요청에 대해 서버가 응답을 마지면 연결을 끊는 성질을 말한다. 
stateless(무상태) 란 connectionless로 인해 서버가 클라이언트를 식별할수 없는 성질을 말한다. 
이러한 HTTP의 특징으로 상태를 기억하기위해 쿠키와 세션, JWT를 이용한다.

 

쿠키

쿠키는 서버에 인증하기 위해 클라이언트의 정보를 클라이언트측에 저장한다.

쿠키를 이용해 서버는 브라우저에 데이터를 넣을 수 있어  쿠키는 서버에서 응답할때 / 데이터를 보낼때 사용한다.

클라이언트가 서버에서 요청을 하면 , 서버가 쿠키를 생성한다. 생성한 쿠키에 정보를 담아 클라이언트에게 응답한다.(HTTP Response 헤더의 'set-cookie')

서버가 보낸 쿠키를 브라우저에 저장을 한다.

클라이언트 요청과 서버의 응답이 끝나면 HTTP의 비연결성으로 인해 연결이 끊긴다.

해당 웹사이트를 방문할 때마다 브라우저는 전에 받은 쿠키를 요청과 함께 보내게 된다. (HTTP Request 헤더의 'cookie')

브라우저가 보낸 쿠키를 서버가 읽어 해당 요청에 대한 응답을 해 HTTP의 무상태한 성질을 보완한다.

 

쿠키를 이용한 서버-클라이언트의 통신

 

쿠키의 장단점

많은 인증을 거치지 않고 서버가 클라이언트를 쉽게 식별가능하다.쿠키에 대한 정보를 HTTP Header에 추가해 보내기에 많은 트래픽을 발생시킨다. 쿠키가 유출되면 해당 데이터에 대한 보안 문제점도 발생할 수 있다.

 

세션

세션은 쿠키를 기반으로 하지만 쿠키와 다르게 서버 측에서 저장하고 관리한다. 

예시로 lemonade 이름과 비밀번호와 함께 서버로부터 로그인 요청을 보내고, 이름과 비번이 맞다면 , 서버는 세션DB에 lemonade이라는 유저를 생성한다.

해당 세션에는 별도의 ID가 존재해 서버로부터 쿠키를 통해 브라우저로 돌아오고 저장된다.(HTTP Response 헤더의 'set-cookie)

서버가 보낸 쿠키를 브라우저에 저장을 한다.

클라이언트 요청과 서버의 응답이 끝나면 HTTP의 비연결성으로 인해 연결이 끊긴다.

만약 같은 웹사이트의 다른 페이지로 이동할 경우 , 브라우저는 세션ID를 갖고 있는 쿠키를 서버에게 보낸다.(HTTP Request 헤더의 'cookie')

서버는 세션 ID를 갖고있는 쿠키를 확인한다. 해당 세션 ID를 가지고 세션 DB를 확인할 것이고, 거기서 해당 ID는 lemonade의 것이라는 것을 알게되고, 그제서야 서버는 식별을 한다.

클라이언트는 세션ID를 쿠키로 메모리 저장된 형태로 가지고 있어 브라우저가 종료되면 사라지게 된다.

결국 중요한 정보는 모두 서버에 있고 브라우저는 세션ID만 가지고 있을뿐이다. 

 

세션의 장단점

중요 정보는 서버에 저장되어 있어 쿠키에 비해 보안에 강화되어 있다.

세션ID를 주고받고 인증을 거쳐 서버의 데이터를 참조해야하기에 쿠키에 비해 느리다.

세션은 서버의 자원을 사용해 서버에 부하를 줄 수 있다.

세션 하이재킹 같은 해킹의 위험성이 있다.

 

토큰

클라이언트가 서버에 요청을 하면 서버에서 인증이 되었다는 의미로 토큰을 부여한다. 토큰은 클라이언트에 저장이되고 토큰을 발급받은 클라이언트는 다시 서버에게 요청을 보낼때 요청헤더에 토큰을 넣어서 보낸다. 서버는 세션DB에서 해당 토큰과 일치하는 유저를 찾는다.

세션은 현재 로그인한 유저들의 모든 세션 ID를 DB에 저장해야한다는 것이다. 유저가 늘어날수록 DB가 점점 증가하게된다. 이런 문제점을 해결할 JWT가 등장한다.

JWT(Json Web Token)

JWT란 JSON 객체를 사용하여 인증에 필요한 정보들을 토큰에 담아 암호화시켜 사용하는 토큰이다. 토큰 형식으로 된 JWT는 유저를 처리할때 세션DB를 가질 필요가 없다. 서버는 유저 ID를 가져다가 signing 알고리즘을 이용해서 ‘사인’을 한다. 그리고 해당 ‘sign된 정보’를 string 형태로 보내게 된다.

→ JWT에서 서버는 유저를 인증하는데 필요한 정보를 토큰에 저장한다. 그리고 해당 토큰을 브라우저에 준다. 페이지를 요청하면 서버는 세션 DB를 거칠 필요 없이 해당 토큰이 유효한지 아닌지만 검증하면 된다.

 

JWT의 장단점

DB없이 토큰이 유효한지 아닌지만 확인하기에 강제 로그아웃,유저 제한 기능들을 할 수 없다.

클라이언트 측에서 저장하므로 서버 메모리 혹은 DB에 부담을 주지 않는다.

토큰이 탈취당할시 만료될때까지 대처가 불가능하다.

 

Reference

https://interconnection.tistory.com/74

https://code-lab1.tistory.com/298

https://brunch.co.kr/@jinyoungchoi95/1

'CS' 카테고리의 다른 글

Data Structure  (0) 2023.04.02
Development Common Sense  (0) 2023.03.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함