月亮

[WEB] 인증 Authentication 과 인가 Authorization / Session vs Token, JWT 본문

web

[WEB] 인증 Authentication 과 인가 Authorization / Session vs Token, JWT

듀네 2023. 4. 20. 16:43

로그인을 구현한다고 할때, 일반적인 생각

-> 사용자의 아이디와 비밀번호를 그대로 데이터베이스에 저장해서 로그인 할때 확인하면 되지 않을까?

=> 데이터베이스가 뚫리면 그대로 전부 유출 될 수 있다.

 

로그인 기능만 있고 로그인 유지 기능이 없다면?

->  메일에서 글쓸때, 메일 지울때마다 일일이 로그인해야하는 번거로움 생긴다.

=> 그러므로 한번 로그인을 하면 내가 로그인되어 있다는 것을 서버가 알수 있어야 한다.

 

그렇기 때문에 로그인을 구현 할 때 보안과 UX에 신경써야한다.

-> 그래서 서버를 만들 때 "인증"과 "인가"를 어떻게 할지가 주요이슈이다.

 

인증 Authentication

 

 

 

 

+ 쿠키 Cookie : 그냥 옮기는 시스템, 매개체

 

세션 Session 

클라이언트와 서버 간의 상호 작용을 통해 생성되는 일시적인 상태 정보의 집합을 의미한다.
클라이언트의 상태 정보를 유지하기 위한 메커니즘

중요한 유저 정보는 모두 서버에 있다.
유저가 가지고 있는건 세션id 뿐이다
쿠키는 그저 세션id를 전달하기 위한 매개체일 뿐이다
세션을 이용해 안드,ios앱를 만들수 있지만 쿠키는 브라우저에만 있기 때문에 사용할 수 없다, 쿠키는 네이티브 앱에서는 사용 할 수 없음 (->토큰을 이용한다)
현재 로그인한 유저들의 모든 세션id를 db에 저장해야한다 (요청들어올때 마다 서버는 쿠키를 받아서 세션id 일치하는지찾기)

1. 클라이언트가 서버에 최초로 접속해서 로그인한다.(이름+비번을 서버에 보냄)

2. 서버에는 클라이언트를 구별 할 수 있는 별도의 세션 id를 발급하고 세션db에 저장한다. (세션id는 일반적으로 랜덤한 문자열로 구성된다)

3. 클라이언트에게 전송한다

4. 클라이언트는 이후 요청 보낼때 (같은 웹사이트의 다른 페이지로 이동 같은) 브라우저는 세션id를 가지고 있는 쿠키를 서버에게 보낸다. 5. 서버는 세션id와 함께 오는 쿠키를 확인한다.

6. 해당 세션id를 가지고 세션db를 확인 거기서 유저를 확인하고 서버는 그제서야 우리가 누구인지 알게됨 (다른 페이지 접근시 게속 반복된다)

7. 클라이언트가 로그아웃하거나 세션이 만료되면 서버는 해당 클라이언트의 상태 정보를 삭제한다.

  • 브라우저 -> 세션db ->서버 ->브라우저
토큰 (Token) : 서버가 기억하는 이상하게 생긴 텍스트
이상한 string
사용자 인증 및 권한 부여를 위해 사용되는 보안 기술
일반적으로 사용자가 로그인을 하면 서버에서 토큰을 발급하고, 이 토큰을 이용하여 해당 사용자가 인증된 사용자임을 증명하고 권한을 부여받습니다.
토큰은 보통 문자열 형태로 되어 있으며, 발급된 토큰은 클라이언트에서 저장됩니다. 클라이언트는 이 토큰을 이용하여 서버에 요청을 보낼 때마다 인증 정보를 함께 전송합니다. 서버는 해당 토큰을 검증하여 해당 사용자가 인증된 사용자인지 확인하고, 권한을 부여합니다.

토큰을 서버에 보내고 서버는 세션db에서 해당하는 토큰과 일치하는 유저를 찾는다.

 

JWT (JSON Web Token) : 정보를 갖고 있는 토큰 , db 없이 검증 할 수 있다
유저가 늘어남에 따라 db리소스가 더 필요하기 때문에 나옴
토큰형식
세션db를 갖을 필요가 없다, 서버는 유저 인증한다고 많은 일을 하지 않아도 됨
서버에서 받아서 요청 할 때마다 보내야 하는 것
JWT는 공간 제약 없다 길어도 됨
**jwt는 암호와되지 않음-비밀번호를 jwt안에 둬서는 안됨

예시로

1. 유저의 id, 비밀번호 서버에 보냄

2. 서버는 유저의 id를 가져다가 사인 알고리즘을 이용해서 '사인'을 한다.

3. 해단 사인된 정보를 String 형태로 보낸다. (쿠키는 공간 제약이 있다) (db를 건드리는 대신 정보를 사인하고 전달한다)

서버에 요청

1. 세션id와 비슷하게 사인된 정보 혹인 토큰을 서버에 보낸다.

2. 서버는 토큰을 받으면 해당 사인이 유효한지 체크하고 (조작했는지 등) 유효하면 인증

 


JWT와 세션의 차이점

세션 : 그냥 세션id만 주면된다 - 세션에 대한 모든 정보는 세션db에 저장되어 있어서 - 페이지를 요청하면 서버는 세션id를 db에서 찾으면 된다
jwt :  서버는 유저를 인증하는데 필요한 정보를 토큰에 저장 - 해당 토큰을 브라우저에 준다 - 페이지 요청하면 서버는 해당 토큰이 유효한지만 검증하면 끝남(db안거침) 

 

JWT와 세션의 장단점

세션 - 모든 유저 정보를 db에 저장 - 해당 정보를 이용하면 새로운 기능들을 추가 할 수 있게된다 (서버가 누가 로그인 했는지 저장했고 세션db가 있기 때문) - 유지하려면 db를 사고 유지해야한다, 유저가 늘어나면 날수록 db도 커져야한다. (redis같은)
JWT - 생성된 토큰을 추적하지 않는다 서버에서는 유효한지 아닌지만 체크할뿐 db 필요없음, 강제 로그아웃 같은거 못함 유효기간 지나야 가능, jwt가 들어간 qr코드,세션db없이 유저 인증

 

 

 

 

==> 유저인증을 위해서 JWT 혹은 세션을 사용할 수 있다!

 

 

 

참고 : https://www.youtube.com/watch?v=tosLBcAX1vk 

 

반응형
Comments