본문 바로가기
스프링

[Spring] 인증과 인가

by 리포터12 2022. 12. 17.
728x90

인증(Authentication)

해당 유저가 실제 유저인지 인증하는 것

 

인가(Authorization)

해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 것

 

인증 방식

인증 방식은 여러가지가 있음. 그 중 '웹 어플리케이션 인증' 에 대해 알아 보자.

많다니까 두개만 알아보자.

1. 쿠키-세션 인증 방식

2. JWT(JSON Web Token) 기반 인증방식

 

웹 어플리케이션 인증의 특수성

1. 일반적으로 서버 - 클라이언트 구조로 돼 있음. 실제로 이 두가지 요소는 아주 멀리 떨어져 있음.

2. HTTP 이라는 프로토콜을 이용하여 통신함. 통신은 '비연결성 무상태' 로 이루어짐.

 

비연결성(Connectionless)이란?

서버와 클라이언트가 상시로 연결되어 있지 않다는 것을 의미함.

게임처럼 실시간으로 계속해서 정보가 변하는 것을 하지 않는 이상. 서버와 클라이언트는 연결 돼 있지 않음.

이렇게 서버와 클라이언트가 필요할 때만 연결되는 이유는, 리소스를 절약하기 위함임.

필수 정보 외의 모든 정보가 상시로 연결되어 이용된다면 서버 비용이 폭발적으로 늘어남.

따라서 필요한 요청에 필요한 응답만 내고 연결을 끊는 것.

 

무상태(Stateless)

서버가 클라이언트의 상태를 저장하지 않는다는 것을 의미함.

기존의 상태를 저장하는 것 또한 서버의 비용과 부담을 증가시키는 행위임.

이를 막기 위해 '기존의 상태가 없다' 는 가정 하에 프로토콜을 이용해 구현 됐음.

 

 

쿠키 - 세션 방식

쿠키-세션 방식은 서버가 특정 유저가 로그인 되었다는 상태를 저장하는 방식임.

인증과 관련된 아주 약간의 정보만 서버가 가지고 있게 됨. 

인증과 관련된 최소한의 정보는 저장해서 로그인을 유지시키는 방식

쿠키 - 세션 인증 방식

1. 사용자가 로그인 요청을 보냄.

2. 서버가 DB의 유저 테이블에서 아이디와 비밀번호를 확인(대조)함.

3. 로그인 정보와 유저 테이블의 정보가 일치하면 인증을 통과한 것으로 보고, '세션 저장소'에 해당 유저의 로그인 정보를토대로 세션을 생성함.

4. 세션 저장소에서 유저의 정보와 관련 없는 난수 session-id를 발급함.

5. 서버는 로그인 요청의 응답으로 session-id 를 리턴함.

6. 클라이언트는 그 session-id를 쿠키에 보관함. 로그인 성공 이후부터는 데이터 요청과 함께 (Session-Id가 담긴) 쿠키를 함께 보냄.

7. 세션 저장소에서 받은 쿠키를 검증함.

8. session-id가 확인 됐다는 것 = 회원이라는 것. 

9. 로그인 된 유저(회원)에 따른 응답을 반환함.

 

JWT 기반 인증

JWT(JSON Web Token)는 인증에 필요한 정보들을 암호화 시킨 토큰을 말함. 

JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별함.

 

JWT 인증 방식

1. 사용자가 로그인 요청을 보냄.

2. 서버가 DB의 유저 테이블에서 아이디와 비밀번호를 확인(대조)함.

3. 로그인 정보가 유저 테이블의 정보와 일치하면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화함.

4. 서버는 로그인 요청의 응답으로 jwt 토큰을 리턴함.

5. 클라이언트는 그 토큰을 저장소에 보관하고 앞으로의 요청마다 토큰을 같이 보냄.

6. 클라이언트 요청에서 토큰이 발견되면 서버에서 토큰을 검증함.

7. 로그인 된 유저에 따른 응답(+ 요청 데이터) 반환함.

 

이러한 방식들을 심화시킨 방식들도 있음.

ex)

JWT 는 Refresh token과 Access token으로 분리하거나

각 인증 방식에 기반한 OAUTH 소셜 로그인 등

 

한 번에 다 하려면 빡세니까 천천히 알아보자..

 

 

복습 하는 느낌으로

함 보자.

https://www.youtube.com/watch?v=tosLBcAX1vk&list=RDCMUCUpJs89fSBXNolQGOYKn0YQ&index=1 

 

728x90

'스프링' 카테고리의 다른 글

@ResponseBody  (0) 2022.12.19
[Spring] JPA Auditing  (0) 2022.12.18
애노테이션 몇 개  (0) 2022.12.16
[Spring] @ResponseBody  (0) 2022.12.08
[Spring] Cause: error: invalid source release: 17  (0) 2022.12.07

댓글