기술 블로그 읽어도 읽고나면 머릿속에서 사라지는 개념 (나만 그러면 ㅈㅅ)
마침 회사에서 JWT를 써서 로그인이 구현되었다는 걸 알게되었고 이 김에 정리 해본다.
참고한 유튜브
https://youtu.be/1QiOXWEbqYQ?si=c0EGLU3ZWa4Lq_DT
저 토끼가 말하는 게 항마력 떨어지긴 하지만 그래도 조각강의 중에 가장 명쾌하게
설명해주는 게 얄코같다. 헷갈리는 것들을 주로 명확하게 잘 짚어주심. 그래서
인프런 강의도 개인적으로 구매해서 듣는 중이다. (진도는 안나가는 중이지만 ><)
우리는 어떤 서버에 회원가입을 하고 로그인을 했을 때에 그 서버를 유영할 수 있는
'권한'을 얻게되는데 이를 보장해주고 허가해주는 것이 '인증' 이다.
그리고 서버에 내가 로그인 해서 접속했음을 인지하게 해줄 수 있는 방법이 여러가지가 있다.
🛠️ 세션
세션ID를 사용해 서버에 로그인 되어있는 상태가 지속되는 상태가 Session이다.
쿠키와 다른 점?
쿠키와 비슷해서 개념을 이해하는데에 조금 헷갈렸었다. 쿠키는 클라이언트에 저장되고 세션은 서버에 저장된다.
하지만 세션 id를 쿠키에 담아서 통신하기 때문에 아주 다른 개념이라고는 볼 수 없다.
세션은 브라우저와 웹 서버가 연결되어 브라우저가 종료될 때까지 유지된다. 세션 id를 담은 쿠키가 주고 받아지는 동안
서버가 클라이언트를 식별할 수 있게 하는 기술이 세션 기반 인증 방식인데 보통 세션이라고 한다.
🛠️ 토큰
클라이언트 측에서 인증정보를 보관하는 방법이다. Session 기반 인증은 클라이언트측에서 유저 정보를 요청할 때마다
해당 정보를 줘도 되는지에 대해 세션 값 일치 여부를 확인해야 한다. 요청마다 DB를 찔러봐야 한다는 것이다.
그렇다면 클라이언트 측에 보관하는 거니 보안이 취약하지는 않을까?
토큰은 유저 정보를 암호화 한 상태로 클라이언트 측에 담을 수 있다. 이를 활용하고 있는 것이 JWT 이다.
🛠️ JWT
Json Web Token 의 약자이다. 사용자가 로그인을 하게 되면 토큰이라는 입장티켓이 출력되는데 형태가 없는
자유 티켓이라 사용할때마다 DB를 찌를 필요 없이 서버를 유영할 수 있게 된다.
형태는 인코딩 또는 암호화 된 정보 3가지를 이어붙인 형태로 보이게 된다. 각각 Header, Payload, Signature로
구성되어 있다. 검사창 -> Application에서 토큰을 찾아 아래의 홈페이지에서 디코딩을 해볼 수도 있다.
디코딩을 해볼 수도 있기에 기본적인 정보 외에! 암호화가 쭉 유지되어야 하거나 중요한 정보들은 담지 않는 게 좋다.
⛏️ 토큰의 종류?
토큰에는 두 가지가 있다. access token, refresh token. 유효기간을 따로 두고 보안을 강화시킨 것이다.
이름을 보면 대충 짐작이 가겠지만 refresh token이 access token 보다 유효기간이 조금 더 긴 편이다.
1. 사용자가 로그인을 하면 서버로부터 access token, refresh token 총 2개의 토큰을 받는다. 이때 실제로 권한을 얻는데에
사용하게 되는 토큰은 access token이다. 그리고 안전한 곳에 refresh token을 저장한다.
2. 이 토큰이 언제 어디서 탈취될 지 모르니 (like 계좌라면 털릴수도...) access token은 유효기간을 짧게 둔다.
3. access token이 만료될 때마다 refresh token으로, 말 그대로 access token을 refresh 하는 것이다.
저장소에 있던 refresh token 과 비교한 후에 유효한지를 판단하고 응답을 보낸다.
결론 👉 access token은 로그인 정보에 접근할 수 있는 카드키 refresh token은 카드키 재발급.
'개념정리' 카테고리의 다른 글
가비지 컬렉션? 가비지 컬렉터? (0) | 2024.05.29 |
---|---|
Local Storage, Session Storage, Cookie (0) | 2024.01.15 |
프론트개발자가 알아야 하는 HTTP통신 (1) | 2024.01.10 |
Virtual Dom, 가상돔 ? (1) | 2024.01.10 |
SASS ? SCSS ? 뭐가다른디 (0) | 2024.01.10 |