ToBe끝판왕

[ 개념 정리 ] Session 과 Token 로그인 방식 본문

카테고리 없음

[ 개념 정리 ] Session 과 Token 로그인 방식

업그레이드중 2024. 12. 20. 23:46
반응형

 

 


 

 

■  로그인 방식

 

▶  로그인 방식에 대한 생각


로그인은 인증 ( 클라이언트가 본인임을 검증하는 과정 ) + 인가 ( 인증 작업 후, 클라이언트에게 접근권한 부여 )
으로 이루어져 있으며 보통 로그인을 구현하는데 세션 ( Session ) 과 토큰 ( Token )을 이용한 방식으로
구현하게 된다.

 

 

 

세션 ( Session ) 로그인 방식

 

 

 

 

 

•  세션 ID 로그인 방식

 

-  서버에서 Session ID 생성

   ( 계정 정보를 읽어 사용자 확인 후, 고유한 ID 값을 부여하여 세션 저장소에 저장하고 Session ID 발급 )

 

-  서버는 HTTP 응답 헤더에 발급된 Session ID 를 실어 보낸다. 매 요청마다 HTTP 요청 헤더에

   Session ID 가 담긴 쿠키를 같이 실어 보낸다.

 

-  서버에서는 쿠키를 받아 Session 저장소에서 대조를 한 후, 대응되는 정보를 가져와 인증이 완료되면

   사용자에게 맞는 데이터를 보내준다.

 

-  Session 은 서버측에서 관리

    ( 서버에서 Session 정보를 저장하고 필요에 따라 삭제도 가능 하다. )

 

 

 

•  세션 ID 로그인 장점

-  사용자의 정보는 Session 저장소에 저장되고 Cookie 는 그 저장소를 통과할 수 있는 출입증 정도의 역할이다.

-  Cookie 가 담긴 HTTP 요청이 도중에 노출되더라도 Cookie 자체에는 유의미한 값을 갖고 있지 않아 안전하다.

   ( 즉 보안성이 높다. )

 

 

•  세션 ID 로그인 단점

-  세션 하이재킹 공격에 취약

   ( 해커가 Cokkie를 탈취 후, HTTP 요청을 보내면 서버는 사용자로 오해하여 정보를 전달하게 됨 )

-  클라이언트가 요청할 때마다 서버에서 Session 

 

 

•  세션 로그인 방식 주의점

-   세션 유효시간 설정  :  적절한 세션 유효시간을 설정하여 보안을 강화해야 함

-   세션 고정 공격 방지

 

 

 

•  세션 방식 주요 메서드

메서드명 설명
HttpSession 세션 정보를 관리하는 객체
getSession() 기존 세션이 있으면 반환, 없으면 새로운 세션을 생성하여 반환
setAttribute(String name, Object Value ) 세션에 속성을 설정
getAttribute( String name ) 세션에 설정된 속성을 가져옴
removeAttribute(String name ) 세션에서 속성을 제거
invalidate() 세션을 무효화

 

 

 

•  세션 메서드 사용 예시

    @GetMapping("/myPage")
    public String myInfoPage( @ModelAttribute("userInfo") UserDto userDto, Model model) throws Exception {

        log.info("========== 마이페이지 양식 페이지 ==========");

        // 세션에서 회원ID 세팅
        // 요청에 연결된 세션 반환 ( false = 새로운 세션 반환, 없으면 null 반환 )
        HttpSession session = request.getSession(false);
        
        // 세션에 저장된 "loginMember" 속성을 가져온다.
        LoginDto loginDto = (LoginDto) session.getAttribute("loginMember");

        if (session != null) {

            String memberId = loginDto.getMemberId();
    
    
    ( .... 추가 로직 )
    
    }

 

 

 


 

 

토큰 ( Token ) 로그인 방식

 

 

•  JWT ( Json Web Token )

-  가장 많이 사용되는 토큰 형식으로, JSON 형식으로 되어 있으며 디지털 서명이 포함되어 있다.

-  로그인 이후, 서버가 만들어서 사용자에게 넘겨주는 문자열이 토큰이다.

-  해당 문자열은 사용자 정보가 암호화 되어 있고, 토큰을 이용하여 인증된 사용자인지 서버가 판단한다.

 

 

•  JWT ( Json Web Token ) 의 구조

   

1) Header

-  토큰의 종류 , 해싱 알고리즘의 정보 로 2가지 정보가 담겨져 있다.

-  typ  :  토큰의 타입을 지정

-  alg  :  해싱 알고리즘을 지정

               ( 보통 HMAC-SHA256 혹은 RSA 가 사용, 알고리즘은 토큰을 검증할때 사용되는 signature 부분에서 사용 )

 

2) Payload

-  토큰의 내용물이 인코딩 된 부분

-  사용자 정보 ( 아이디, 권한 등 ) 을 JSON 형식으로 담는다.

 

3) Signature

-  토큰을 인코딩하거나 유효성 검증 할 때 사용하는 고유한 암호화 코드

-  Header 와 Payload 의 값을 각각 BASE64 로 인코딩하고, 인코딩한 값을 비밀키로 이용해 헤더에서 정의한 알고리즘을 해싱하고

    이 값을 다시 BASE64 로 인코딩하여 생성

-  토큰의 무결성을 보장

 

 

 

•  토큰 ( Token ) 로그인 방식

 

 

-  사용자는 Id 와 password 를 입력하고 서버로 요청

 

-  서버는 DB 에서 회원정보를 조회하고 등록된 사용자인지 확인

 

-  등록된 사용자라면 서버는 토큰을 생성하고 앞단으로 토큰과 함께 응답을 전송

 

-  응답이 성공적으로 왔다면, 로그인( 인증 ) 이 성공적으로 된 것이므로 요청에 Token을 함께 보낸다.

 

-  서버는 로그인 이후의 추가 요청에 함께 실려온 토큰을 검증하고 검증이 성공적으로 끝나면 권한이 있는 사용자라 판단하고

    요청된 데이터에 응답해준다. ( 인가 )

 

 

▶  토큰 로그인 방식 과정

로그인 요청   ->  인증  ->  토큰 발급  ->  토큰 저장  ->  후속 요청  ->  토큰 검정  ->  응답

 

 

•  토큰 로그인 장점

-  자체적으로 유효성 검증 가능 ( 토큰내 정보를 통해서 서버에서 별도의 저장 없이 유효성 검증 가능 )

-  다양한 정보를 Payload 에 추가하여 사용 가능하다. ( = 확장성이 좋다. )

-  Json Web Token 표준을 따라 많은 라이브러리와 도구를 활용 가능하다.

 

 

•  토큰 로그인 단점

-  JWT 토큰 을 생성하고 검증하는데 사용되는 비밀키를 안전하게 

-  토큰의 유효시간을 관리 해야 한다.

-  토큰 탈취 시, 권한이 도용 가능하다.

 

 

•  토큰 로그인 방식 주의점

-   토큰이 만료되기 전에 미리 갱신하는 기능의 구현 필요성

-   적절한 유효기간을 설정해서 보안을 강화해야 한다.

 

 

 

 

 

반응형
Comments