[스프링] 쿠키, 토큰, 세션, JWT

구동현·2024년 1월 31일

스프링

목록 보기
19/21

선행 블로그 에서 다루고 있는 내용입니다.

인증과 인가?

인증이란

식별가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정

인가란

인증된 사용자에 대한 자원접근허가 확인

즉, 인가보다 인증이 선행되어야 한다.


어떻게 인증과 인가를 할 것인가

1. Request Header 활용하기

http에서 얻은 정보 UserId : kudongku 가 있을 때,

인코더를 통해

skdfsjkhs312rfdsajnk라는 인코드로 바뀌었다.

이를 데이터베이스에 보내고,
데이터 베이스는 이를 디코드한 다음에,
데이터베이스에서 맞는지 조회한다.

단 다른 url에서는 다시 로그인을 해야되는 상황이 온다.

2. Browser 활용하기

브라우저 쿠키에 사용자 정보를 집어넣고,
http에 담아서 주고받는다.

서버는 이를 데이터베이스를 조회해서 일치불일치를 확인한다.

단, 해커가 정보를 가져가기 딱 좋음

3. Session 활용하기

session id만 주고 받음

단, 서버가 하나일 경우와 여러개일 경우가 달라지고, 비용이 많이 든다.

4. jwt 활용하기

jwt 자체는 해독하기는 쉽다.

secret key로 코드가 만들어지긴한다.

그렇기 때문에 비밀번호는 담으면 안된다.

  • 만료기한을 정할 수 있다.


쿠키, 세션, JWT?

스프링 security를 마주치고 생긴 의문점.
쿠키? 토큰? 세션? JWT?


쿠키

브라우저와 서버는 http로 서로에게 요청과 응답을 한다.

요청 : 클라이언트가 서버에게 보내는 데이터
응답 : 서버가 클라이언트에게 보내는 데이터

요청과 응답에는 쿠키가 포함된다!!!

정확히 말하면, 헤더의 한 공간을 쿠키가 차지한다.

그렇게 보내진 쿠키는 브라우저에 저장되고,
같은 도메인에서만 쿠키를 주고받는다.

  • 유효기간이 있다.
  • 이론상 보안적으로 뛰어나다
  • 브라우저만 사용가능

세션

  • 백엔드에 세션이란, 유저의 로그인상태를 관리하는 것

server가 한개일때,

  • sever에서 session을 관리, client에게 sessionId를 준다.
  • sessionId = key, 유저정보는 value라고 생각하면 편함
  • 헤더에 담겨서 주게 된다. (쿠키에 담겨서)

트랙픽이 server하나로 부족하다면,

  • 서버를 늘린다.
  • server가 여러개라면? sessionId가 키일때 value를 찾을 수가 없다.
  • 결론 : 외부 DB에서 session을 관리한다.
  • Redis같은 서버 저장소를 사용한다. (mySQL X)
  • S3도 있다. (동영상, 사진 저장용)

Redis?

  • mySql : 하드디스크 SDD에 저장하는 것, 가격이 싸다
  • redis는 더럽게 비싸다..?
  • 하지만 빨랐죠
  • 그래서 휘발성데이터만 저장한다.
  • AWS memory DB : 몰라도 된다.

JWT (Json Web Tokens)

jwt의 특징은 statless, 한 단어로 정의가 가능하다.

Stateless

  • 무상태를 의미
  • 상태가 없다.

여기서 상태란?

  • 데이터
  • 유저의 정보라고 볼수도 있다.

즉, 서버에게 정보가 없고, jwt가 정보를 갖는 것을 의미

Header, Payload, Signature로 구성되었다.

글자 색이 각 part를 담당한다.

즉, encoded가 된 코드를 decode하면, payload에 담긴 정보를 얻을 수 있다.

해킹할 수 있는거 아닌가요?

  • signature에 담긴 secretkey가 코드를 encode하는 것!!

  • jwt 안에 유저정보가 들어가 있기때문에, server 상관없이 인증가능


application.properties에 적힌 secretKey로 암복화가 가능하다!


정리

  1. session은 client에게 session id를 주고, client가 request에 session id를 넣어서 보내면(쿠키든, 헤더이든, 바디든) server에서 id를 key로 data를 value로 처리한다.
  2. server의 개수가 하나보다 클 경우에는, session을 갖는 데이터베이스가 있어야한다.
  3. jwt는 인증 토큰을 client에게 준다. client가 request할때마다 토큰을 실어서 보내고, server는 토큰을 검증하기만 하면 된다.
  4. 토큰 자체가 암호화된 것은 아니기 때문에, 개인정보는 조심히 보내야한다.
profile
개발합시다

0개의 댓글