티스토리 뷰

728x90
반응형

 

1. 인증,인가 와 쿠키,세션

 

  • 인증(Authenication) : 사용자 신원을 확인하는 행위
  • 인가(Authorization) : 사용자 권한을 확인하는 행위

웹에서의 인증 및 인가

  • 인증 : 로그인을 통해 본인임을 확인 (주로, 아이디와 패스워드 이용)
  • 인가 : 주로 역할에 따른 사용권한 관리

HTTP

HTTP는 상태를 저장하지 않는다. (Stateless 하다)

위에 그림에서 클라이언트의 요청을 서버에게 보낸 후 응답을 받을 때 까지가 하나의 HTTP요청이다. 하지만 HTTP 상태는 기억되지 않기 때문에 웹 서버에서는 1번과 2번이 같은 클라이언트의 요청인지 알 수 없다.

 

쿠키와 세션 모두 HTTP에 상태 정보를 유지(Stateful)하기 위해 사용된다. 즉, 쿠키와 세션을 통해 서버에서는 클라이언트 별로 인증 및 인가를 할 수 있게 된다.

 

쿠키

  • 클라이언트에 저장될 목적으로 생성한 작은 정보를 담은 파일이다.
  • Name, Value, Domain, Path, Expires로 구성되어 있다.
  • 사용자 인증에 대한 정보를 모두 클라이언트가 가지고 있게 되므로 보안에 취약하다. 그래서 쿠키 자체는 보안과는 큰 상관이 없는 장바구니 혹은 자동로그인 설정 등에 이용할 수 있다.

 

세션

  • 서버에서 일정시간 동안 클라이언트 상태를 유지하기 위해 사용
  • 서버에서 클라이언트 별로 유일무이한 세션ID를 부여한 후 클라이언트 별 필요한 정보를 서버에 저장
  • 서버에서 생성한 세션ID는 클라이언트의 쿠키값(세션쿠키 라고 부름)으로 저장되어 클라이언트 식별에 사용됨
  • 세션 저장소를 서버에서 관리하기 때문에 사용자가 많아지면 많아질수록 서버에 걸리는 부하가 증가한다.

세션 동작 방식

세션 동작방식

  1. 클라이언트가 로그인 요청
  2. 서버에서는 클라이언트에게 고유한 세션ID를 부여하고 세션 저장소에 저장한 후 클라이언트에게 발급한다.
  3. 클라이언트는 서버에서 발급받은 세션ID를 쿠키에 저장하게 되고 요청을 보낼 때 마다 쿠키를 보낸다.
  4. 서버는 쿠키에 담겨있는 세션ID와 세션 저장소에 있는 정보와 대조한 후 데이터를 가져온다.

 

쿠키와 세션 비교

 

JWT 토큰

  • JWT는 Json Web Token의 약자이고 인증에 필요한 정보들을 암호화시킨 토큰을 말한다.
  • 세션 방식처럼 토큰 자체를 쿠키에 담아서 보내줄 수도 있고 HTTP 헤더에 담아서 보내줄 수도 있다.
  • JWT는 Header, Payload, Signature로 이루어져 있고 Signature는 Header, Payload와 Secret Key가 더해져 암호화 된다.
  • Header와 Payload는 누구나 디코딩하여 내용을 확인할 수 있기때문에 유저의 비밀번호 같은 정보는 넣지않도록 한다. 하지만 Secret Key를 알지 못하면 Signature는 복호화 할 수 없다. 그렇기 때문에 토큰이 변조되더라도 Signature에 Payload를 기반으로 암호화 되었기 때문에 유효하지 않은 토큰으로 검증 가능하다.
  • 토큰은 세션보다 훨씬 간편하다. 세션처럼 별도의 저장소 관리가 필요하지 않고 토큰을 발급한 후 클라이언트에게 전송 후 검증하는 과정만 있으면 된다.

JWT 토큰 동작방식

  1. 클라이언트가 로그인 요청
  2. 서버에서 유저의 고유한 ID와 다른 인증 정보들과 함께 Payload에 담는다.
  3. JWT의 유효시간 설정 및 옵션을 설정해준다.
  4. Secret Key를 이용해 토큰을 발급한다.
  5. 발급된 토큰은 클라이언트에 쿠키 혹은 로컬스토리지 등에 저장하여 요청을 보낼때마다 같이 보낸다.
  6. 서버는 토큰을 Secret Key로 복호화하여 검증하는 과정을 거친다.
  7. 검증이 완료되면 대응하는 데이터를 보내준다.

 

2. 스프링 시큐리티

 

스프링 시큐리티는 스프링 기반의 어플리케이션의 보안(인증과 인가)을 담당하는 프레임워크이다.

implementation 'org.springframework.boot:spring-boot-starter-security' 를 gradle에 추가하여 사용하면된다.

  • 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있다.
  • Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
  • 어노테이션을 통한 간단한 설정
  • Spring Security는 기본적으로 세션&쿠키 방식으로 인증

 

3. 패스워드 암호화

 

회원 등록시 비밀번호는 사용자가 입력한 문자 그대로 DB에 저장하면 안된다.

해시함수를 통해 암호화는 되지만 복호환는 되지 않는 일방향 암호 알고리즘을 사용하여 암호화 한다.

  • 암호화(O) : "nobodynobody" => "$2a$10$.."
  • 복호화(X) : "$2a$10$.." => "nobodynobody" 

암호화된 비밀번호를 DB에 저장하게 되면 다시한번 접속할때 그 비밀번호가 맞는지 확인하는 방법은 DB에 저장된 암호화된 비밀번호와 사용자가 지금 입력한 평문 텍스트를 암호화하여 DB값이랑 비교하면 일치여부를 판단할 수 있다.

 

스프링 시큐리티에서 제공해주고, 권고되고 있는 'BCrypt' 해시함수를 사용해 패스워드를 암호화하여 DB에 저장하였다.

 

 

4. 로그인, 로그아웃 기능

 

  • 스프링 시큐리티 사용 전

 

  • 스프링 시큐리티 사용 후

 

  • 로그인 처리 과정

 

인증/인가 성공 시에만, Controller에게 회원 정보 전달 (UserDetails)

 

 

5. 소셜로그인

 

모든 웹 사이트에서 회원가입 과정을 거치는 것은 사용자에게 부담이 되고 매번 번거로운 과정을 수행해야 하기 때문에 이런 문제를 해결하기 위해 OAuth를 사용한 소셜 로그인이 등장하게 되었다.

 

OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대한 웹사이트나 어플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다. 사용자가 애플리케이션에게 모든 권한을 넘기지 않고 사용자 대신 서비스를 이용할 수 있게 해주는 HTTp 기반의 보안 프로토콜 이다.

 

 

카카오 로그인 사전설정

 

  • 회원가입

 

  • 내 애플리케이션 메뉴 선택 > 애플리케이션 추가하기

  • 사이트 도메인 등록하기

  • 카카오로 로그인 했을 때 인가토큰을 받게 될 Redirect URI (callback) 를 설정하기 (로그인 끝나고 부를 API)

  • 동의항목 설정하기

 

코드구현

 

 

 

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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