이 글은 사용자의 IP Address를 보고 국문판을 보여줄 것인지 영문판을 보여줄 것인지를 자동으로 결정하는 방법을 설명합니다.

최신 IP Address 할당 정보는 KRNIC(www.krnic.net)에 가시면 있습니다.

=== 소 스 ====
< %
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 작성자 : 정준명 (twiny@shinbiro.com)
' 작성일 : 1999년 4월 1일 (만우절이군요)
' 기 능 : Severvariables의 REMOTE_ADDR을 읽어와 국내할당된 IP Address 범위와 매칭
' 을 시켜 본 후 그 결과에 따라 특정 페이지로 리디렉션을 한다.
' REMOTE_HOST를 이용하면 훨씬 간단하게 할 수 있으나 호스트 이름이 없는 경우 IP Address로
' 바뀌기 때문에 완벽하게 하기 위해서는 REMOTE_ADDR의 값을 이용해야 한다.
'
'=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Dim strIPAddr
Dim strBClass
Dim strCClass
Dim pos, pos2, pos3
Dim Temp

'웹 서버에 접속한 사용자의 IP Address를 가져옵니다. (예- 203.239.136.1)
strIPAddr = Request.servervariables("REMOTE_ADDR")

'IP Address를 B Class와 C Class에 맞게 변환
' 이때 자리수를 무조건 3자리로 변환 된다. 즉 203.15.21.0일 경우 203.015.021.000으로

pos = InStr(1, strIPAddr, ".", 1)
strBClass = Left(strIPAddr, pos - 1)

pos2 = InStr(pos + 1, strIPAddr, ".", 1)
Temp = Mid(strIPAddr, pos + 1, pos2 - pos - 1)

'자리수를 3자리로 맞추는 루틴
If Len(Temp) = 1 Then
Temp = "00" & Temp
ElseIf Len(Temp) = 2 Then
Temp = "0" & Temp
End If
'B Class주소 완성
strBClass = strBClass & Temp

pos3 = InStr(pos2 + 1, strIPAddr, ".", 1)
Temp = Mid(strIPAddr, pos2 + 1, pos3 - pos2 - 1)
If Len(Temp) = 1 Then
Temp = "00" & Temp
ElseIf Len(Temp) = 2 Then
Temp = "0" & Temp
End If

'C Class주소 완성
strCClass = strBClass & Temp

Select Case strBClass
'우선 국내 할당된 B Class와 비교 한다.
Case "128134", "129254", "134075", "137068", "141223", "143248", "147006", "147043", "147046", "147047", _
"150150", "150183", "150197", "152099", "152149", "154010", "155230", "156147", "157197", "158044", _
"161122", "163152", "163180", "163239", "163243", "164124", "164125", "165132", "165133", "165141", _
"165186", "165194", "165213", "165229", "165243", "165244", "165246", "166079", "166103", "166104", _
"166125", "168078", "168115", "168126", "168131", "168154", "168188", "168219"

' 여기서 특정 동작을 넣으면 되겠죠?
response.redirect ("http://www.tradeorder.co.kr/kmain1.htm")

'국내 할당된 B Class에 속하지 않을 경우
Case Else
Select Case strCClass

'국내 할당된 C Class
Case "192100002", "192104015", "192132015", "20202099", "202020119"
response.redirect ("http://www.tradeorder.co.kr/kmain1.htm")
Case Else
If (strCClass >= 192132039 And strCClass < = 192132040) Or (strCClass >= 192132248 And strCClass < = 192132255) _
Or (strCClass >= 192203138 And strCClass < = 192203145) Or (strCClass >= 192245250 And strCClass < = 192245251) _
Or (strCClass >= 192203138 And strCClass < = 192203145) Or (strCClass >= 192245250 And strCClass < = 192245251) _
Or (strCClass >= 192249016 And strCClass < = 192249031) Or (strCClass >= 202020083 And strCClass < = 202020086) _
Or (strCClass >= 202020128 And strCClass < = 202020255) Or (strCClass >= 202021000 And strCClass < = 202021007) _
Or (strCClass >= 202030000 And strCClass < = 202030255) Or (strCClass >= 202031000 And strCClass < = 202031255) _
Or (strCClass >= 203224000 And strCClass < = 203255255) Or (strCClass >= 210090000 And strCClass < = 210091255) _
Or (strCClass >= 210092000 And strCClass < = 210127255) Or (strCClass >= 210178000 And strCClass < = 210183255) _
Or (strCClass >= 210216000 And strCClass < = 210219255) Then
response.redirect ("http://www.tradeorder.co.kr/kmain1.htm")
'국내 할당된 IP Address가 아닌 경우
Else
response.redirect ("http://www.tradeorder.co.kr/emain0.htm")
End If
End Select
End Select
%>
2005/06/15 13:36 2005/06/15 13:36
*Response.Redirect 대신 Sever.Transfer를 사용하라

Response.Redirect는 Sever에서 브라우저에 요청 후 Sever로 돌아오나. Sever.Transfer는 Server내부에서 처리됩니다.

*Directory URL에 후행 슬러시 사용

후행 슬래시를 생략하면 브라우저는 서버에 요청하여 디렉터리를 요구하고 있다는 응답을 받습니다. 그러면 브라우저는 URL에 슬래시를 첨가하여 두번째 요청을 하며 이때서야 서버가 그 디렉터리에 대한 기본 문서로 응답합니다.

*Sever 변수사용금지

서버 변수에 액세스하면 웹 사이트가 서버에 특별한 요청을 하게 되어 요청한 것만이 아니라 모든 서버 변수를 수집하게 됩니다. 속도가 저하됨
ex : < Response.Write(“Data”)>

*< OBJECT> Tag를 사용하라

Server.CreateObject는 즉시 개체를 만듭니다. 이 개체를 나중에 사용하지 않는다면 결국 리소스를 낭비하는 것입니다. < object id=objname> 태그는 objname을 선언하지만 이 개체의 메서드 또는 속성 중 하나가 처음 사용될 때까지 objname은 실제로 만들어지지 않습니다.
Ex : < OBJECT runat=server progid=ADODB.Connection id=dbcon> < /OBJECT>

*일괄 처리 인라인 스크립트 및 Response.Write 문

응답버퍼링을 켜지 않으면 이 문(statement)이 여러 작은 패킷으로 네트워크를 통해 브라우저로 데이터를 쓰게 됩니다. 이 과정은 매우 느립니다. 작은 양의 스크립트 및 HTML을 여기 저기 배치하면 스크립트 엔진과 HTML간의 전환이 일어나서 성능이 떨어집니다. 가깝게 모여있는 인라인 식(expression)을 Response.Write를 한 번 호출하는 것으로 교체합니다. 특히 게시판과 같이 Until 문을 사용할 때 사용하시면 좋은 효과를 보것입니다.
Ex)
< table>
< % For Each fld in rs.Fields %>
< th>< % = fld.Name %>< /th>
< %
Next
While Not rs.EOF
%>
< tr>
< % For Each fld in rs.Fields %>
< td>< % = fld.Value %>< /td>
< % Next
< /tr>
< % rs.MoveNext
Wend %>
< /table>
아래에 있는 더 효율적인 코드는 행마다 응답 스트림에 쓰기가 하나 있습니다. 모든 코드는 하나의 VBScript 블록에 포함됩니다.
< table>
< %
For each fld in rs.Fields
Response.Write ("< th>" & fld.Name & "< /th>" & vbCrLf)
Next
While Not rs.EOF
Response.Write ("< tr>")
For Each fld in rs.Fields %>
Response.Write("< td>" & fld.Value & "< /td>" & vbCrLf)
Next
Response.Write "< /tr>"
End
%>< /table>


*세션 개체의 현명한 사용

ASP는 자동으로 웹 서버에 접근하는 모든 사용자를 위한 세션을 작성합니다. 각 세션은 약 10 KB의 메모리 오버헤드(세션에 저장된 모든 데이터의 상단에 있는)를 갖고 있어서 모든 요청을 약간 늦춥니다. 세션은 구성할 수 있는 시간 제한 기간동안 유효하며 이 제한 시간은 일반적으로 20분입니다.
세션이 필요하지 않은 컨텐츠(도움말 화면, 방문자 영역 등)를 세션이 꺼진 별도의 ASP 응용 프로그램으로 옮길 수 있습니다. 각 페이지를 기초로 해당 페이지에 세션 개체가 필요 없다는 것을 알리기 위해 다음과 같은 지시어를 ASP 페이지 상단에 놓을 수 있습니다.
< % @EnableSessionState=False %>
이 지시어를 사용하게 되는 이유 중 하나는 세션이 프레임셋과 관심있는 문제를 만드는 것입니다. ASP는 언제나 한번에 한 세션에서 하나의 요청만이 실행되도록 보장합니다. 따라서 브라우저가 한 사용자를 위해 여러 페이지를 요청하면 한번에 단지 하나의 ASP 요청만이 세션에 전달되기 때문에 세션 개체에 액세스할 때 멀티스레딩 문제를 방지하지만 모든 페이지는 동시에 페인트되지 않고 차례로 순차적 방법으로 페인트됩니다. 어떤 프레임셋 페이지가 세션에 의지하지 않는 다면 ASP가 @EnableSessionState=False 지시어를 사용하도록 하십시오
2005/06/15 13:36 2005/06/15 13:36
1. 범위(Scope)
Active Directory의 범위는 넓다. WAN 상의 모든 단일 개체(프린터, 파일, 사용자), 모든 서버, 모든 도메인이 한 범위에 포함될 수 있으며, 서로 결합된 여러 WAN이 포함될 수도 있다. 다음 용어 중 일부는 단일 네트워크 이상의 규모에 적용되므로, Active Directory가 하나의 컴퓨터에서 컴퓨터 네트워크로, 그리고 서로 결합된 많은 컴퓨터 네트워크로 확장될 수 있다는 사실을 염두해 두어야 한다.

2. 이름 공간(Namespace)
다른 디렉터리 서비스와 마찬가지로 Active Directory도 기본적으로 이름 공간이다. 전화 번호부도 이름 공간이다. 이름 공간은 주어진 이름을 확인할 수 있는 어떤 영역이다. 이름 확인은 이름이 나타내는 개체나 정보로 이름을 변환하는 과정이다. 전화 번호부는 전화 가입자의 이름으로 전화 번호를 얻을 수 있는 이름 공간을 형성한다. Windows 파일 시스템은 파일 이름으로 파일을 얻을 수 있는 이름 공간을 형성한다.
Active Directory는 이름 공간을 형성하며, 디렉터리에 속한 개체 이름으로 개체를 찾을 수 있게 한다.

3. 개체(Object)
개체란 서로 구별이 가능하고 특정한 이름이 부여된 속성(Attribute)들의 집합으로서 사용자, 프린터 또는 응용 프로그램과 같은 구체적인 대상을 가리킨다. 속성은 주체를 기술하는 데이터를 담고 있으며, 주체는 디렉토리 개체에 의해 식별된다. 개체가 사용자라면 속성에는 사용자의 성, 이름, 전자 메일 주소 등이 포함될 것이다.

4. 조직단위(Organizational Units : OU)
조직단위는 도메인 내에서 관리적인 경계선을 정의하는 수단이 된다. 엑티브 디렉토리 개체를 포함하고 조직화하는 OU는, 폴더와 파일들을 포함하고 조직화하는 폴더와 비슷한 개념이다.

5. 컨테이너(Container)
컨테이너는 속성을 가지고 있고 Active Directory 이름 공간의 일부분이라는 점에서 개체와 같다. 그러나 개체와는 달리, 컨테이너는 구체적인 무엇을 나타내지 않으며 개체 그룹과 다른 컨테이너를 담는 그릇 역할을 한다.

6. 트리(Tree)
트리라는 용어는 이 문서 전반에 걸쳐서 개체 및 컨테이너의 계층 구조를 기술하기 위해 사용된다. 일반적으로 트리의 종점은 개체이고 노드(트리의 분기점)는 컨테이너이다. 트리는 개체들의 연결 상태나 개체 간의 경로를 나타낸다. 단순한 디렉토리도 컨테이너이고 컴퓨터 네트워크나 도메인도 컨테이너이다. 연속 하위 트리는 트리에서 중단 없이 계속 이어지는 경로로서 해당 경로 내의 모든 컨테이너 구성원도 포함된다.

7. 명명 컨텍스트(Naming Context)와 파티션(Partition)
Active Directory는 하나 이상의 명명 컨텍스트 또는 파티션으로 구성된다. 명명 컨텍스트는 디렉터리의 연속 하위 트리이고 복제의 단위이다. Active Directory에서 하나의 서버는 언제나 세 개 이상의 명명 컨텍스트를 갖는다.
A. 스키마
B. 구성(복제 토폴로지 및 관련 메타데이터)
C. 하나 이상의 사용자 명명 컨텍스트(디렉터리 내의 실제 개체를 포함하는담고 있는 하위 트리)

8. 도메인(Domain)
도메인은 엑티브 디렉토리의 논리적 구조에서 핵심적인 단위이다. 도메인은 도메인 이름 내의 서버들과 네트워크 자원들의 논리적인 그룹이다. 이론적으로 하나의 도메인은 천만 개까지의 개체들을 포함할 수 있지만, 실용적으로는 백만 개까지의 개체들을 포함할 수 있다(참고로 윈도우NT 4.0에서는 도메인 당 약 25,000개의 계정들을 실용적으로 포함할 수 있었다).
도메인은 Windows NT 또는 Windows 2000 컴퓨터 네트워크의 보안 경계이다. 도메인의 관리자는 다른 도메인에 대한 허가와 권한을 구체적으로 부여받지 않는 이상, 단지 해당 도메인 내에서만 관리작업을 수행할 수 있는 허가와 권한을 부여받는다. 윈도우NT에서의 도메인은 윈도우2000에서는 OU로 격하되는 경우가 많다는 사실에 유의하여야 할 것이다.
윈도우2000의 도메인 이름은 기본적으로 DNS에 기반한 도메인 이름 부여모델을 구현했다. 윈도우2000의 도메인 이름은 기본적으로 DNS 이름에 대응되며, 이것을 확장한 것이다. 윈도우2000의 도메인 이름의 예를 들면, support.mcpserver.co.kr과 같다.
Active Directory는 하나 이상의 도메인으로 구성된다. 독립형 워크스테이션인 경우, 도메인은 그 컴퓨터 자체이다. 도메인은 하나 이상의 실제 장소로 확대될 수 있다. 모든 도메인은 고유의 보안 정책을 가지고 있으며 다른 도메인과 보안 관계를 갖는다.

9. 도메인 트리(Trees)
도메인 트리(또는 트리)는 스키마, 구성을 공유하는 여러 도메인으로 구성되며 연속 이름 공간을 형성한다. 또한 한 트리 내의 도메인들은 트러스트 관계에 의해 서로 연결된다. Active Directory는 하나 이상의 트리의 모음이다.
트리는 두 가지 측면에서 볼 수 있다. 하나는 도메인 간의 트러스트 관계로 보는 것이고, 다른 하나는 도메인 트리의 이름 공간으로 보는 것이다.
A. 트러스트 관계(Trust Relationship)로 보기
각각의 도메인과 이들 간의 트러스트 방법에 기반하여 도메인 트리를 그릴 수 있다. Windows 2000은 Kerberos 보안 프로토콜에 기반하여 도메인 간의 트러스트 관계를 수립한다. Kerberos 트러스트는 전이적이고 계층적이기 때문에, 만약 도메인 A가 도메인 B를 트러스트하고 도메인 B가 도메인 C를 트러스트하면, 도메인 A도 도메인 C를 트러스트하게 된다.
B. 이름 공간으로 보기
이름 공간에 기반하여 도메인 트리를 그릴 수도 있다. 도메인 트리의 이름 공간을 따라 경로를 거슬러 올라가면 개체의 전체 이름을 얻을 수 있다. 이러한 방식으로 트리를 보는 것은 개체들을 논리 계층 구조로 그룹화하는 데 도움이 된다. 연속 이름 공간의 주요 이점은 이름 공간의 루트에서 심층 검색을 수행하면 전체 계층 구조를 검색할 수 있다는 것입니다.

10. 포리스트(Forests)
포리스트는 연속 이름 공간을 형성하지 않는 하나 이상의 트리의 모음이다. 포리스트 내의 모든 트리는 스키마, 구성, 글로벌 카탈로그를 공유한다. 주어진 포리스트 내의 모든 트리는 전이적이고 계층적인 Kerberos 트러스트 관계를 통해 서로를 트러스트한다. 트리와 달리 포리스트에는 고유의 이름이 필요하지 않는다. 포리스트는 상호 참조 개체 모음 및 구성원 트리에 알려진 Kerberos 트러스트 관계로 존재한다. 포리스트 내의 트리들은 Kerberos 트러스트와 관련해서 계층 구조를 형성하므로, 트러스트 트리의 루트에 있는 트리 이름으로 그 포리스트를 표현할 수 있다.

11. 사이트(Site)
사이트 는 네트워크에서 Active Directory 서버가 있는 위치다. 사이트는 잘 연결된 하나 또는 그 이상의 TCP/IP 서브넷으로 정의된다. "잘 연결"되어 있다는 것은 네트워크 연결의 안정성이 높고 속도가 빠르다는 것이다(예: 10Mbps 이상의 LAN 속도). 사이트가 서브넷 모음으로 정의되기 때문에, 관리자는 실제 네트워크를 이용하여 빠르고 쉽게 Active Directory 액세스 및 복제 토폴로지를 구성할 수 있다. 사용자가 로그온하면 Active Directory 클라이언트는 사용자와 동일한 사이트에서 Active Directory 서버를 찾는다. 네트워크 개념에서 동일한 사이트에 있는 컴퓨터들은 서로 가깝기 때문에, 이들 사이의 통신은 안정적이고 빠르며 효율적이다. 로그온할 때 로컬 사이트를 찾는 작업은 어렵지 않다. 사용자의 워크스테이션이 자신이 속해 있는 TCP/IP 서브넷을 이미 알고 있고 서브넷이 Active Directory 사이트로 바로 변환되기 때문이다.
2005/06/15 13:35 2005/06/15 13:35